git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@27090 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:     wxWidgets 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>
 | |
| 
 |