agora inbox for [email protected]help / color / mirror / Atom feed
Re: eWeek Poll: Which database is most critical to your 266+ messages / 2 participants [nested] [flat]
* Re: eWeek Poll: Which database is most critical to your @ 2002-03-01 20:08 Dann Corbit <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Dann Corbit @ 2002-03-01 20:08 UTC (permalink / raw) To: Hannu Krosing <[email protected]>; Tom Lane <[email protected]>; +Cc: Neil Conway <[email protected]>; pgsql-hackers [snip] >>---------------------------------------------------------------------- --------------- Thought for the day: Caching this stuff could very easily exhaust the entire server disk space in a jiffy. Any lists stashed in memory will take away from database performance for normal sorts of queries. Any lists stashed on disk will have to be read again. Where is the big savings? <<---------------------------------------------------------------------- --------------- Sure. It would a) make many queries faster b) make client libs (ODBC/JDBC/ECPG) faster and simpler by not forcing them to fake it. But there is also a big class of applications that would benefit much more from caching exact queries. And it will make us as fast as MySQL for 100000 consecutive calls of SELECT MAX(N) FROM T ;) >>---------------------------------------------------------------------- --------------- Try as I might, I can't think of anything that could possibly be more useless than that. ;-) I agree that some web apps might benefit mightily with a careful plan for this notion. Maybe a special function/procedure call is in order. If someone wants to explore this stuff, I'm all for it. But I think it needs careful thought. I suspect that: 1. The work for retaining ACID properties of the database is ten times harder than anyone cares to imagine with changes of this nature. 2. The benefit for most apps will be small, and will be negative if not implemented properly. 3. The functionality can *already* be achieved by user applications simply by holding open your own cursors and reusing them. For whoever wants to tackle this thing, I say, "GO for it!" But go for it with both eyes open. I don't think it should be anyone's priority. But that is just because it isn't very interesting to me. Maybe other people are a lot more keen on it. <<---------------------------------------------------------------------- --------------- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
* [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() @ 2023-01-21 00:09 Andres Freund <[email protected]> 0 siblings, 0 replies; 266+ messages in thread From: Andres Freund @ 2023-01-21 00:09 UTC (permalink / raw) This just updates the places that "Zero initialize instr_time uses causing compiler warnings" changed, to see whether this is a nicer approach. --- src/include/portability/instr_time.h | 24 ++++++++++++++------ src/backend/access/transam/xlog.c | 11 +++------- src/backend/storage/buffer/bufmgr.c | 16 +++++--------- src/backend/storage/file/buffile.c | 16 +++++--------- src/backend/storage/ipc/latch.c | 8 +++---- src/bin/psql/common.c | 33 +++++++++++++--------------- 6 files changed, 50 insertions(+), 58 deletions(-) diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index af2ab6ec887..2d1ff4f7f82 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -17,6 +17,10 @@ * * INSTR_TIME_IS_LT(x, y) x < y * + * INSTR_TIME_ZERO() an instr_time set to 0 + * + * INSTR_TIME_CURRENT() an instr_time set to current time + * * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too) * * INSTR_TIME_SET_CURRENT(t) set t to current time @@ -110,7 +114,7 @@ typedef struct instr_time #define PG_INSTR_CLOCK CLOCK_REALTIME #endif -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_clock_gettime_ns(void) { @@ -123,8 +127,8 @@ pg_clock_gettime_ns(void) return now; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_clock_gettime_ns()) +#define INSTR_TIME_CURRENT(t) \ + pg_clock_gettime_ns() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = NS_PER_S * (s)) @@ -138,7 +142,7 @@ pg_clock_gettime_ns(void) /* Use QueryPerformanceCounter() */ -/* helper for INSTR_TIME_SET_CURRENT */ +/* helper for INSTR_TIME_CURRENT */ static inline instr_time pg_query_performance_counter(void) { @@ -160,8 +164,8 @@ GetTimerFrequency(void) return (double) f.QuadPart; } -#define INSTR_TIME_SET_CURRENT(t) \ - ((t) = pg_query_performance_counter()) +#define INSTR_TIME_CURRENT(t) \ + pg_query_performance_counter() #define INSTR_TIME_SET_SECONDS(t, s) \ ((t).ticks = s * GetTimerFrequency()) @@ -181,7 +185,13 @@ GetTimerFrequency(void) #define INSTR_TIME_IS_LT(x, y) ((x).ticks < (y).ticks) -#define INSTR_TIME_SET_ZERO(t) ((t).ticks = 0) +#define INSTR_TIME_ZERO(t) (instr_time){0} + +#define INSTR_TIME_SET_CURRENT(t) \ + (t) = INSTR_TIME_CURRENT() + +#define INSTR_TIME_SET_ZERO(t) \ + ((t) = INSTR_TIME_ZERO()) #define INSTR_TIME_SET_CURRENT_LAZY(t) \ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fb4c860bdea..f563800c8ab 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -2178,7 +2178,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) Size nbytes; Size nleft; int written; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); /* OK to write the page(s) */ from = XLogCtl->pages + startidx * (Size) XLOG_BLCKSZ; @@ -2191,8 +2191,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* Measure I/O timing to write WAL data */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); written = pg_pwrite(openLogFile, from, nleft, startoffset); @@ -2204,9 +2202,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time duration = INSTR_TIME_CURRENT(); - INSTR_TIME_SET_CURRENT(duration); INSTR_TIME_SUBTRACT(duration, start); PendingWalStats.wal_write_time += INSTR_TIME_GET_MICROSEC(duration); } @@ -8137,7 +8134,7 @@ void issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) { char *msg = NULL; - instr_time start; + instr_time start = INSTR_TIME_ZERO(); Assert(tli != 0); @@ -8153,8 +8150,6 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) /* Measure I/O timing to sync the WAL file */ if (track_wal_io_timing) INSTR_TIME_SET_CURRENT(start); - else - INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); switch (sync_method) diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 800a4248c95..d8baf80e650 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1012,19 +1012,17 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, MemSet((char *) bufBlock, 0, BLCKSZ); else { - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); smgrread(smgr, forkNum, blockNum, (char *) bufBlock); if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); @@ -2826,8 +2824,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) { XLogRecPtr recptr; ErrorContextCallback errcallback; - instr_time io_start, - io_time; + instr_time io_start = INSTR_TIME_ZERO(); Block bufBlock; char *bufToWrite; uint32 buf_state; @@ -2904,8 +2901,6 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -2918,7 +2913,8 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 0a51624df3b..6f813279690 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -429,8 +429,7 @@ static void BufFileLoadBuffer(BufFile *file) { File thisfile; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -446,8 +445,6 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); /* * Read whatever we can get, up to a full bufferload. @@ -468,7 +465,8 @@ BufFileLoadBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_read_time, io_time); } @@ -500,8 +498,7 @@ BufFileDumpBuffer(BufFile *file) while (wpos < file->nbytes) { off_t availbytes; - instr_time io_start; - instr_time io_time; + instr_time io_start = INSTR_TIME_ZERO(); /* * Advance to next component file if necessary and possible. @@ -527,8 +524,6 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) INSTR_TIME_SET_CURRENT(io_start); - else - INSTR_TIME_SET_ZERO(io_start); bytestowrite = FileWrite(thisfile, file->buffer.data + wpos, @@ -543,7 +538,8 @@ BufFileDumpBuffer(BufFile *file) if (track_io_timing) { - INSTR_TIME_SET_CURRENT(io_time); + instr_time io_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(io_time, io_start); INSTR_TIME_ADD(pgBufferUsage.temp_blk_write_time, io_time); } diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index f4123e7de7e..8092ff4a984 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -1385,8 +1385,7 @@ WaitEventSetWait(WaitEventSet *set, long timeout, uint32 wait_event_info) { int returned_events = 0; - instr_time start_time; - instr_time cur_time; + instr_time start_time = INSTR_TIME_ZERO(); long cur_timeout = -1; Assert(nevents > 0); @@ -1401,8 +1400,6 @@ WaitEventSetWait(WaitEventSet *set, long timeout, Assert(timeout >= 0 && timeout <= INT_MAX); cur_timeout = timeout; } - else - INSTR_TIME_SET_ZERO(start_time); pgstat_report_wait_start(wait_event_info); @@ -1489,7 +1486,8 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) { - INSTR_TIME_SET_CURRENT(cur_time); + instr_time cur_time = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(cur_time, start_time); cur_timeout = timeout - (long) INSTR_TIME_GET_MILLISEC(cur_time); if (cur_timeout <= 0) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f907f5d4e8d..5badb029e83 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1269,15 +1269,12 @@ DescribeQuery(const char *query, double *elapsed_msec) bool timing = pset.timing; PGresult *result; bool OK; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); *elapsed_msec = 0; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* * To parse the query but not execute it, we prepare it, using the unnamed @@ -1350,7 +1347,8 @@ DescribeQuery(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1400,16 +1398,13 @@ ExecQueryAndProcessResults(const char *query, { bool timing = pset.timing; bool success; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); PGresult *result; FILE *gfile_fout = NULL; bool gfile_is_pipe = false; if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); if (pset.bind_flag) success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char * const *) pset.bind_params, NULL, NULL, 0); @@ -1490,7 +1485,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1595,7 +1591,8 @@ ExecQueryAndProcessResults(const char *query, */ if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec = INSTR_TIME_GET_MILLISEC(after); } @@ -1693,8 +1690,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) int ntuples; int fetch_count; char fetch_cmd[64]; - instr_time before, - after; + instr_time before = INSTR_TIME_ZERO(); int flush_error; *elapsed_msec = 0; @@ -1706,8 +1702,6 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); /* if we're not in a transaction, start one */ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) @@ -1738,7 +1732,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1786,7 +1781,8 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } @@ -1926,7 +1922,8 @@ cleanup: if (timing) { - INSTR_TIME_SET_CURRENT(after); + instr_time after = INSTR_TIME_CURRENT(); + INSTR_TIME_SUBTRACT(after, before); *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); } -- 2.38.0 --vt42kbp2j7rjcapp-- ^ permalink raw reply [nested|flat] 266+ messages in thread
end of thread, other threads:[~2023-01-21 00:09 UTC | newest] Thread overview: 266+ messages (download: mbox mbox.gz follow: Atom feed) -- links below jump to the message on this page -- 2002-03-01 20:08 Re: eWeek Poll: Which database is most critical to your Dann Corbit <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-01-21 00:09 [PATCH v8 5/5] wip: instr_time: Add and use INSTR_TIME_ZERO(), INSTR_TIME_CURRENT() Andres Freund <[email protected]> 2023-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