aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/dbsize.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2011-04-29 01:44:50 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2011-04-29 01:45:58 -0400
commitfd2e2d09aa1d5ba198e09e6d936ff1bba7f62895 (patch)
treee1abc920b5c1b4d948c937de62aa502afdc7f400 /src/backend/utils/adt/dbsize.c
parentc49e4ae1f886e74efb4bc94c09b993098232d5f9 (diff)
downloadpostgresql-fd2e2d09aa1d5ba198e09e6d936ff1bba7f62895.tar.gz
postgresql-fd2e2d09aa1d5ba198e09e6d936ff1bba7f62895.zip
Rewrite pg_size_pretty() to avoid compiler bug.
Convert it to use successive shifts right instead of increasing a divisor. This is probably a tad more efficient than the original coding, and it's nicer-looking than the previous patch because we don't need a special case to avoid overflow in the last branch. But the real reason to do it is to avoid a Solaris compiler bug, as per results from buildfarm member moa.
Diffstat (limited to 'src/backend/utils/adt/dbsize.c')
-rw-r--r--src/backend/utils/adt/dbsize.c32
1 files changed, 13 insertions, 19 deletions
diff --git a/src/backend/utils/adt/dbsize.c b/src/backend/utils/adt/dbsize.c
index aa4066f9f05..2ee59668cd7 100644
--- a/src/backend/utils/adt/dbsize.c
+++ b/src/backend/utils/adt/dbsize.c
@@ -466,39 +466,33 @@ pg_size_pretty(PG_FUNCTION_ARGS)
int64 size = PG_GETARG_INT64(0);
char buf[64];
int64 limit = 10 * 1024;
- int64 mult = 1;
+ int64 limit2 = limit * 2 - 1;
- if (size < limit * mult)
+ if (size < limit)
snprintf(buf, sizeof(buf), INT64_FORMAT " bytes", size);
else
{
- mult *= 1024;
- if (size < limit * mult)
+ size >>= 9; /* keep one extra bit for rounding */
+ if (size < limit2)
snprintf(buf, sizeof(buf), INT64_FORMAT " kB",
- (size + mult / 2) / mult);
+ (size + 1) / 2);
else
{
- mult *= 1024;
- if (size < limit * mult)
+ size >>= 10;
+ if (size < limit2)
snprintf(buf, sizeof(buf), INT64_FORMAT " MB",
- (size + mult / 2) / mult);
+ (size + 1) / 2);
else
{
- mult *= 1024;
- if (size < limit * mult)
+ size >>= 10;
+ if (size < limit2)
snprintf(buf, sizeof(buf), INT64_FORMAT " GB",
- (size + mult / 2) / mult);
+ (size + 1) / 2);
else
{
- /* Here we have to worry about avoiding overflow */
- int64 val;
-
- mult *= 1024;
- val = size / mult;
- if ((size % mult) >= (mult / 2))
- val++;
+ size >>= 10;
snprintf(buf, sizeof(buf), INT64_FORMAT " TB",
- val);
+ (size + 1) / 2);
}
}
}