git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22915 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			106 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
						|
%% Name:        recguard.tex
 | 
						|
%% Purpose:     wxRecursionGuard documentation
 | 
						|
%% Author:      Vadim Zeitlin
 | 
						|
%% Modified by:
 | 
						|
%% Created:     14.08.03
 | 
						|
%% RCS-ID:      $Id$
 | 
						|
%% Copyright:   (c) Vadim Zeitlin
 | 
						|
%% License:     wxWindows license
 | 
						|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
						|
 | 
						|
\section{\class{wxRecursionGuard}}\label{wxrecursionguard}
 | 
						|
 | 
						|
wxRecursionGuard is a very simple class which can be used to prevent reentrancy
 | 
						|
problems in a function. It is not thread-safe and so should be used only in the
 | 
						|
single-threaded programs or in combination with some thread synchronization
 | 
						|
mechanisms.
 | 
						|
 | 
						|
wxRecursionGuard is always used together with the 
 | 
						|
\helpref{wxRecursionGuardFlag}{wxrecursionguardflag} like in this example:
 | 
						|
\begin{verbatim}
 | 
						|
    void Foo()
 | 
						|
    {
 | 
						|
        static wxRecursionGuardFlag s_flag;
 | 
						|
        wxRecursionGuard guard(s_flag);
 | 
						|
        if ( guard.IsInside() )
 | 
						|
        {
 | 
						|
            // don't allow reentrancy
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        ...
 | 
						|
    }
 | 
						|
\end{verbatim}
 | 
						|
 | 
						|
As you can see, wxRecursionGuard simply tests the flag value and sets it to
 | 
						|
true if it hadn't been already set. 
 | 
						|
\helpref{IsInside()}{wxrecursionguardisinside} allows testing the old flag
 | 
						|
value. The advantage of using this class compared to directly manipulating the
 | 
						|
flag is that the flag is always reset in the wxRecursionGuard destructor and so
 | 
						|
you don't risk to forget to do it even if the function returns in an unexpected
 | 
						|
way (for example because an exception has been thrown).
 | 
						|
 | 
						|
\wxheading{Derived from}
 | 
						|
 | 
						|
No base class
 | 
						|
 | 
						|
\wxheading{Include files}
 | 
						|
 | 
						|
<wx/recguard.h>
 | 
						|
 | 
						|
 | 
						|
\latexignore{\rtfignore{\wxheading{Members}}}
 | 
						|
 | 
						|
\membersection{wxRecursionGuard::wxRecursionGuard}\label{wxrecursionguardctor}
 | 
						|
 | 
						|
\func{}{wxRecursionGuard}{\param{wxRecursionGuardFlag\& }{flag}}
 | 
						|
 | 
						|
A wxRecursionGuard object must always be initialized with a (static) 
 | 
						|
\helpref{wxRecursionGuardFlag}{wxrecursionguardflag}. The constructor saves the
 | 
						|
value of the flag to be able to return the correct value from 
 | 
						|
\helpref{IsInside}{wxrecursionguardisinside}.
 | 
						|
 | 
						|
 | 
						|
\membersection{wxRecursionGuard::\destruct{wxRecursionGuard}}\label{wxrecursionguarddtor}
 | 
						|
 | 
						|
\func{}{\destruct{wxRecursionGuard}}{\void}
 | 
						|
 | 
						|
The destructor resets the flag value so that the function can be entered again
 | 
						|
the next time.
 | 
						|
 | 
						|
Note that it is not virtual and so this class is not meant to be derived from
 | 
						|
(besides, there is absolutely no reason to do it anyhow).
 | 
						|
 | 
						|
 | 
						|
\membersection{wxRecursionGuard::IsInside}\label{wxrecursionguardisinside}
 | 
						|
 | 
						|
\constfunc{bool}{IsInside}{\void}
 | 
						|
 | 
						|
Returns \true if we're already inside the code block ``protected'' by this
 | 
						|
wxRecursionGuard (i.e. between this line and the end of current scope). Usually
 | 
						|
the function using wxRecursionGuard takes some specific actions in such case
 | 
						|
(may be simply returning) to prevent reentrant calls to itself.
 | 
						|
 | 
						|
If this method returns \false, it is safe to continue.
 | 
						|
 | 
						|
 | 
						|
 | 
						|
\section{\class{wxRecursionGuardFlag}}\label{wxrecursionguardflag}
 | 
						|
 | 
						|
This is a completely opaque class which exists only to be used with 
 | 
						|
\helpref{wxRecursionGuard}{wxrecursionguard}, please see the example in that
 | 
						|
class documentation.
 | 
						|
 | 
						|
Please notice that wxRecursionGuardFlag object \emph{must} be declared 
 | 
						|
\texttt{static} or the recursion would never be detected.
 | 
						|
 | 
						|
\wxheading{Derived from}
 | 
						|
 | 
						|
No base class
 | 
						|
 | 
						|
\wxheading{Include files}
 | 
						|
 | 
						|
<wx/recguard.h>
 | 
						|
 |