Skip site navigation (1) Skip section navigation (2)

Re: ps display

From: Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: PostgreSQL-patches <pgsql-patches(at)postgresql(dot)org>
Subject: Re: ps display
Date: 2001-03-20 22:39:35
Message-ID: 200103202239.RAA29260@candle.pha.pa.us (view raw or flat)
Thread:
Lists: pgsql-patches
I have applied this patch that Tom Lane and I worked on to fix the
display of WAIT status on setproctitle() displays.

Without the patch, on setproctitle() machines, the ps display was
truncated when waiting on a lock.


> Here is an extended version of your patch that cleans things up some
> more (uses StrNCpy, for example).  I've checked the USE_PSTAT and
> USE_CLOBBER_ARGV paths.
> 
> 			regards, tom lane
> 
> *** src/backend/utils/misc/ps_status.c.orig	Sat Feb 17 17:34:26 2001
> --- src/backend/utils/misc/ps_status.c	Tue Mar 20 17:02:03 2001
> ***************
> *** 44,50 ****
>    * PS_USE_PS_STRINGS
>    *     assign PS_STRINGS->ps_argvstr = "string"
>    *     (some BSD systems)
> !  * PS_USE_CHANCE_ARGV
>    *     assign argv[0] = "string"
>    *     (some other BSD systems)
>    * PS_USE_CLOBBER_ARGV
> --- 44,50 ----
>    * PS_USE_PS_STRINGS
>    *     assign PS_STRINGS->ps_argvstr = "string"
>    *     (some BSD systems)
> !  * PS_USE_CHANGE_ARGV
>    *     assign argv[0] = "string"
>    *     (some other BSD systems)
>    * PS_USE_CLOBBER_ARGV
> ***************
> *** 189,252 ****
>   void
>   set_ps_display(const char * value)
>   {
>   	/* no ps display for stand-alone backend */
>   	if (!IsUnderPostmaster)
>   		return;
>   
> ! #ifndef PS_USE_NONE
>   	if (!ps_buffer)
>   		return;
> ! # ifdef PS_USE_SETPROCTITLE
> ! 	setproctitle("%s%s", ps_buffer, value);
>   
> ! # else /* not PS_USE_SETPROCTITLE */
> ! 	{
> ! 		size_t vallen = strlen(value);
>   
> ! 		strncpy(ps_buffer + ps_buffer_fixed_size, value,
> ! 				ps_buffer_size - ps_buffer_fixed_size);
>   
> ! 		if (ps_buffer_fixed_size + vallen >= ps_buffer_size)
> ! 			ps_buffer[ps_buffer_size - 1] = 0;
> ! 		else
> ! 			ps_buffer[ps_buffer_fixed_size + vallen] = 0;
>   
> ! #  ifdef PS_USE_PSTAT
>   		{
>   			union pstun pst;
>   
>   			pst.pst_command = ps_buffer;
>   			pstat(PSTAT_SETCMD, pst, strlen(ps_buffer), 0, 0);
>   		}
> ! #  endif /* PS_USE_PSTAT */
>   
> ! #  ifdef PS_USE_PS_STRINGS
>   		PS_STRINGS->ps_nargvstr = 1;
>   		PS_STRINGS->ps_argvstr = ps_buffer;
> ! #  endif /* PS_USE_PS_STRINGS */
>   
> ! #  ifdef PS_USE_CLOBBER_ARGV
>   		{
>   			char * cp;
>   			/* pad unused memory */
> ! 			for(cp = ps_buffer + ps_buffer_fixed_size + vallen;
>   				cp < ps_buffer + ps_buffer_size;
>   				cp++)
>   				*cp = PS_PADDING;
>   		}
> ! #  endif /* PS_USE_CLOBBER_ARGV */
> ! 	}
> ! # endif /* not USE_SETPROCTITLE */
>   #endif /* not PS_USE_NONE */
>   }
>   
>   
>   /*
>    * Returns what's currently in the ps display, in case someone needs
> !  * it.
>    */
>   const char *
>   get_ps_display(void)
>   {
>   	return ps_buffer + ps_buffer_fixed_size;
>   }
> --- 189,256 ----
>   void
>   set_ps_display(const char * value)
>   {
> + #ifndef PS_USE_NONE
>   	/* no ps display for stand-alone backend */
>   	if (!IsUnderPostmaster)
>   		return;
>   
> ! # ifdef PS_USE_CLOBBER_ARGV
> ! 	/* If ps_buffer is a pointer, it might still be null */
>   	if (!ps_buffer)
>   		return;
> ! # endif
>   
> ! 	/* Update ps_buffer to contain both fixed part and value */
> ! 	StrNCpy(ps_buffer + ps_buffer_fixed_size, value,
> ! 			ps_buffer_size - ps_buffer_fixed_size);
>   
> ! 	/* Transmit new setting to kernel, if necessary */
>   
> ! # ifdef PS_USE_SETPROCTITLE
> ! 	setproctitle("%s", ps_buffer);
> ! # endif
>   
> ! # ifdef PS_USE_PSTAT
>   		{
>   			union pstun pst;
>   
>   			pst.pst_command = ps_buffer;
>   			pstat(PSTAT_SETCMD, pst, strlen(ps_buffer), 0, 0);
>   		}
> ! # endif /* PS_USE_PSTAT */
>   
> ! # ifdef PS_USE_PS_STRINGS
>   		PS_STRINGS->ps_nargvstr = 1;
>   		PS_STRINGS->ps_argvstr = ps_buffer;
> ! # endif /* PS_USE_PS_STRINGS */
>   
> ! # ifdef PS_USE_CLOBBER_ARGV
>   		{
>   			char * cp;
>   			/* pad unused memory */
> ! 			for(cp = ps_buffer + strlen(ps_buffer);
>   				cp < ps_buffer + ps_buffer_size;
>   				cp++)
>   				*cp = PS_PADDING;
>   		}
> ! # endif /* PS_USE_CLOBBER_ARGV */
> ! 
>   #endif /* not PS_USE_NONE */
>   }
>   
>   
>   /*
>    * Returns what's currently in the ps display, in case someone needs
> !  * it.  Note that only the variable part is returned.
>    */
>   const char *
>   get_ps_display(void)
>   {
> + #ifdef PS_USE_CLOBBER_ARGV
> + 	/* If ps_buffer is a pointer, it might still be null */
> + 	if (!ps_buffer)
> + 		return "";
> + #endif
> + 
>   	return ps_buffer + ps_buffer_fixed_size;
>   }
> 


-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman(at)candle(dot)pha(dot)pa(dot)us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

pgsql-patches by date

Next:From: Bruce MomjianDate: 2001-03-20 23:36:53
Subject: pgindent run?
Previous:From: Juhan-Peep ErnitsDate: 2001-03-20 09:12:08
Subject: Re: org.postgresql.Driver.java compile problem

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group