diff options
| author | Tom Lane <tgl@sss.pgh.pa.us> | 2005-11-05 03:04:53 +0000 |
|---|---|---|
| committer | Tom Lane <tgl@sss.pgh.pa.us> | 2005-11-05 03:04:53 +0000 |
| commit | 48052de722a502408275fa3b7aee7de430265fc0 (patch) | |
| tree | 88e3bb1280caae1ee6f4e83724a8f3aa65d25353 /src/backend/utils/error/elog.c | |
| parent | 95af2633c3e3d64a3cc508409a74ef29de25c852 (diff) | |
| download | postgresql-48052de722a502408275fa3b7aee7de430265fc0.tar.gz | |
Repair an error introduced by log_line_prefix patch: it is not acceptable
to assume that the string pointer passed to set_ps_display is good forever.
There's no need to anyway since ps_status.c itself saves the string, and
we already had an API (get_ps_display) to return it.
I believe this explains Jim Nasby's report of intermittent crashes in
elog.c when %i format code is in use in log_line_prefix.
While at it, repair a previously unnoticed problem: on some platforms such as
Darwin, the string returned by get_ps_display was blank-padded to the maximum
length, meaning that lock.c's attempt to append " waiting" to it never worked.
Diffstat (limited to 'src/backend/utils/error/elog.c')
| -rw-r--r-- | src/backend/utils/error/elog.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index 64403ce9b1..44ebac245c 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -42,7 +42,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.166 2005/11/03 17:11:39 alvherre Exp $ + * $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.167 2005/11/05 03:04:52 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -67,6 +67,7 @@ #include "tcop/tcopprot.h" #include "utils/memutils.h" #include "utils/guc.h" +#include "utils/ps_status.h" /* Global variables */ @@ -1484,19 +1485,26 @@ log_line_prefix(StringInfo buf) break; case 'i': if (MyProcPort) - appendStringInfo(buf, "%s", MyProcPort->commandTag); + { + const char *psdisp; + int displen; + + psdisp = get_ps_display(&displen); + appendStringInfo(buf, "%.*s", displen, psdisp); + } break; case 'r': - if (MyProcPort) + if (MyProcPort && MyProcPort->remote_host) { appendStringInfo(buf, "%s", MyProcPort->remote_host); - if (strlen(MyProcPort->remote_port) > 0) + if (MyProcPort->remote_port && + MyProcPort->remote_port[0] != '\0') appendStringInfo(buf, "(%s)", MyProcPort->remote_port); } break; case 'h': - if (MyProcPort) + if (MyProcPort && MyProcPort->remote_host) appendStringInfo(buf, "%s", MyProcPort->remote_host); break; case 'q': |
