5
5
* to contain some useful information. Mechanism differs wildly across
6
6
* platforms.
7
7
*
8
- * $PostgreSQL: pgsql/src/backend/utils/misc/ps_status.c,v 1.26.2.1 2005/11/22 18:23:25 momjian Exp $
8
+ * $PostgreSQL: pgsql/src/backend/utils/misc/ps_status.c,v 1.26.2.2 2010/05/27 19:20:06 tgl Exp $
9
9
*
10
10
* Copyright (c) 2000-2005, PostgreSQL Global Development Group
11
11
* various details abducted from various places
@@ -88,8 +88,11 @@ static const size_t ps_buffer_size = PS_BUFFER_SIZE;
88
88
#else /* PS_USE_CLOBBER_ARGV */
89
89
static char * ps_buffer ; /* will point to argv area */
90
90
static size_t ps_buffer_size ; /* space determined at run time */
91
+ static size_t last_status_len ; /* use to minimize length of clobber */
91
92
#endif /* PS_USE_CLOBBER_ARGV */
92
93
94
+ static size_t ps_buffer_cur_len ; /* nominal strlen(ps_buffer) */
95
+
93
96
static size_t ps_buffer_fixed_size ; /* size of the constant prefix */
94
97
95
98
/* save the original argv[] location here */
@@ -174,7 +177,7 @@ save_ps_display_args(int argc, char **argv)
174
177
}
175
178
176
179
ps_buffer = argv [0 ];
177
- ps_buffer_size = end_of_area - argv [0 ];
180
+ last_status_len = ps_buffer_size = end_of_area - argv [0 ];
178
181
179
182
/*
180
183
* move the environment out of the way
@@ -290,7 +293,7 @@ init_ps_display(const char *username, const char *dbname,
290
293
username , dbname , host_info );
291
294
#endif
292
295
293
- ps_buffer_fixed_size = strlen (ps_buffer );
296
+ ps_buffer_cur_len = ps_buffer_fixed_size = strlen (ps_buffer );
294
297
295
298
#ifdef WIN32
296
299
pgwin32_update_ident (ps_buffer );
@@ -321,6 +324,7 @@ set_ps_display(const char *activity)
321
324
/* Update ps_buffer to contain both fixed part and activity */
322
325
StrNCpy (ps_buffer + ps_buffer_fixed_size , activity ,
323
326
ps_buffer_size - ps_buffer_fixed_size );
327
+ ps_buffer_cur_len = strlen (ps_buffer );
324
328
325
329
/* Transmit new setting to kernel, if necessary */
326
330
@@ -333,7 +337,7 @@ set_ps_display(const char *activity)
333
337
union pstun pst ;
334
338
335
339
pst .pst_command = ps_buffer ;
336
- pstat (PSTAT_SETCMD , pst , strlen ( ps_buffer ) , 0 , 0 );
340
+ pstat (PSTAT_SETCMD , pst , ps_buffer_cur_len , 0 , 0 );
337
341
}
338
342
#endif /* PS_USE_PSTAT */
339
343
@@ -343,13 +347,11 @@ set_ps_display(const char *activity)
343
347
#endif /* PS_USE_PS_STRINGS */
344
348
345
349
#ifdef PS_USE_CLOBBER_ARGV
346
- {
347
- int buflen ;
348
-
349
- /* pad unused memory */
350
- buflen = strlen (ps_buffer );
351
- MemSet (ps_buffer + buflen , PS_PADDING , ps_buffer_size - buflen );
352
- }
350
+ /* pad unused memory; need only clobber remainder of old status string */
351
+ if (last_status_len > ps_buffer_cur_len )
352
+ MemSet (ps_buffer + ps_buffer_cur_len , PS_PADDING ,
353
+ last_status_len - ps_buffer_cur_len );
354
+ last_status_len = ps_buffer_cur_len ;
353
355
#endif /* PS_USE_CLOBBER_ARGV */
354
356
355
357
#ifdef WIN32
@@ -369,24 +371,15 @@ const char *
369
371
get_ps_display (int * displen )
370
372
{
371
373
#ifdef PS_USE_CLOBBER_ARGV
372
- size_t offset ;
373
-
374
374
/* If ps_buffer is a pointer, it might still be null */
375
375
if (!ps_buffer )
376
376
{
377
377
* displen = 0 ;
378
378
return "" ;
379
379
}
380
-
381
- /* Remove any trailing spaces to offset the effect of PS_PADDING */
382
- offset = ps_buffer_size ;
383
- while (offset > ps_buffer_fixed_size && ps_buffer [offset - 1 ] == PS_PADDING )
384
- offset -- ;
385
-
386
- * displen = offset - ps_buffer_fixed_size ;
387
- #else
388
- * displen = strlen (ps_buffer + ps_buffer_fixed_size );
389
380
#endif
390
381
382
+ * displen = (int ) (ps_buffer_cur_len - ps_buffer_fixed_size );
383
+
391
384
return ps_buffer + ps_buffer_fixed_size ;
392
385
}
0 commit comments