[ros-dev] [ros-diffs] [mjmartin] 40557: - Add volatile to variables in OutputDebugStringA. Fix #1 of ? for 3424.

Aleksey Bragin aleksey at reactos.org
Tue Apr 21 20:51:50 CEST 2009


This is a PSEH specific "feature". GCC may think that the variable is  
not used when it's declared or used(?) and optimize it away. To  
prevent this a volatile is added.

At least that's how I remember KJK explained that, and iirc there was  
a ML thread here some time ago about same thing, when Dmitry  
Gorbachev added same thing to the ntoskrnl.

WBR,
Aleksey Bragin.


On Apr 21, 2009, at 9:24 PM, Michael Martin wrote:

>
> IIRC, at one point, someone had said something along the lines that  
> under certain criteria variables used inside SEH2 blocks had to be  
> declared with volatile.
> Not sure if this had been fixed but either way it does looks like  
> an SEH problem.
>
> martin
>
> > Date: Sat, 18 Apr 2009 12:36:31 +0200
> > From: timo.kreuzer at web.de
> > To: ros-dev at reactos.org
> > Subject: Re: [ros-dev] [ros-diffs] [mjmartin] 40557: - Add  
> volatile to variables in OutputDebugStringA. Fix #1 of ? for 3424.
> >
> > Can you explain, why the variables need to be volatile? This  
> looks like
> > a SEH problem.
> >
> > mjmartin at svn.reactos.org schrieb:
> > > Author: mjmartin
> > > Date: Fri Apr 17 13:59:03 2009
> > > New Revision: 40557
> > >
> > > URL: http://svn.reactos.org/svn/reactos?rev=40557&view=rev
> > > Log:
> > > - Add volatile to variables in OutputDebugStringA. Fix #1 of ?  
> for 3424.
> > >
> > > Modified:
> > > trunk/reactos/dll/win32/kernel32/debug/output.c
> > >
> > > Modified: trunk/reactos/dll/win32/kernel32/debug/output.c
> > > URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/ 
> kernel32/debug/output.c?rev=40557&r1=40556&r2=40557&view=diff
> > >  
> ====================================================================== 
> ========
> > > --- trunk/reactos/dll/win32/kernel32/debug/output.c  
> [iso-8859-1] (original)
> > > +++ trunk/reactos/dll/win32/kernel32/debug/output.c  
> [iso-8859-1] Fri Apr 17 13:59:03 2009
> > > @@ -219,9 +219,9 @@
> > > static BOOL s_bDBMonMutexTriedOpen = FALSE;
> > >
> > > /* local copy of the mutex handle */
> > > -	 HANDLE hDBMonMutex = s_hDBMonMutex;
> > > +	 volatile HANDLE hDBMonMutex = s_hDBMonMutex;
> > > /* handle to the Section of the shared buffer */
> > > -	 HANDLE hDBMonBuffer = NULL;
> > > +	 volatile HANDLE hDBMonBuffer = NULL;
> > >
> > > /* pointer to the mapped view of the shared buffer. It consist  
> of the current
> > > process id followed by the message string */
> > > @@ -229,11 +229,11 @@
> > >
> > > /* event: signaled by the debug message monitor when  
> OutputDebugString can write
> > > to the shared buffer */
> > > -	 HANDLE hDBMonBufferReady = NULL;
> > > +	 volatile HANDLE hDBMonBufferReady = NULL;
> > >
> > > /* event: to be signaled by OutputDebugString when it's done  
> writing to the
> > > shared buffer */
> > > -	 HANDLE hDBMonDataReady = NULL;
> > > +	 volatile HANDLE hDBMonDataReady = NULL;
> > >
> > > /* mutex not opened, and no previous attempts to open/create it */
> > > if(hDBMonMutex == NULL && !s_bDBMonMutexTriedOpen)
> > > @@ -295,10 +295,10 @@
> > > _SEH2_TRY
> > > {
> > > /* size of the current output block */
> > > -	 SIZE_T nRoundLen;
> > > +	 volatile SIZE_T nRoundLen;
> > >
> > > /* size of the remainder of the string */
> > > -	 SIZE_T nOutputStringLen;
> > > +	 volatile SIZE_T nOutputStringLen;
> > >
> > > /* output the whole string */
> > > nOutputStringLen = strlen(_OutputString);
> > > @@ -339,11 +339,12 @@
> > > else
> > > {
> > > /* output in blocks of 512 characters */
> > > -	 CHAR a_cBuffer[512];
> > > +	 volatile PCHAR a_cBuffer;
> > > +	 a_cBuffer = (CHAR*)HeapAlloc(GetProcessHeap(), 0, 512);
> > >
> > > /* write a maximum of 511 bytes */
> > > -	 if(nOutputStringLen > (sizeof(a_cBuffer) - 2))
> > > -	 nRoundLen = sizeof(a_cBuffer) - 2;
> > > +	 if(nOutputStringLen > 510)
> > > +	 nRoundLen = 510;
> > > else
> > > nRoundLen = nOutputStringLen;
> > >
> > > @@ -355,6 +356,8 @@
> > >
> > > /* send the current block to the kernel debugger */
> > > DbgPrint("%s", a_cBuffer);
> > > +
> > > +	 HeapFree(GetProcessHeap(), 0, a_cBuffer);
> > > }
> > >
> > > /* move to the next block */
> > >
> > >
> > >
> >
> > _______________________________________________
> > Ros-dev mailing list
> > Ros-dev at reactos.org
> > http://www.reactos.org/mailman/listinfo/ros-dev
>
> Rediscover Hotmail®: Get e-mail storage that grows with you. Check  
> it out.
> _______________________________________________
> Ros-dev mailing list
> Ros-dev at reactos.org
> http://www.reactos.org/mailman/listinfo/ros-dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.reactos.org/pipermail/ros-dev/attachments/20090421/38156cc5/attachment-0001.html 


More information about the Ros-dev mailing list