]> git.saurik.com Git - wxWidgets.git/blame - interface/recguard.h
fixed links to global variables; fixed categories; use @see instead of @seealso
[wxWidgets.git] / interface / recguard.h
CommitLineData
23324ae1
FM
1/////////////////////////////////////////////////////////////////////////////
2// Name: recguard.h
3// Purpose: documentation for wxRecursionGuardFlag class
4// Author: wxWidgets team
5// RCS-ID: $Id$
6// Licence: wxWindows license
7/////////////////////////////////////////////////////////////////////////////
8
9/**
10 @class wxRecursionGuardFlag
11 @wxheader{recguard.h}
7c913512
FM
12
13 This is a completely opaque class which exists only to be used with
23324ae1
FM
14 wxRecursionGuard, please see the example in that
15 class documentation.
7c913512
FM
16
17 Please notice that wxRecursionGuardFlag object must be declared
23324ae1 18 @c static or the recursion would never be detected.
7c913512 19
23324ae1
FM
20 @library{wxbase}
21 @category{FIXME}
22*/
7c913512 23class wxRecursionGuardFlag
23324ae1
FM
24{
25public:
7c913512 26
23324ae1
FM
27};
28
29
30/**
31 @class wxRecursionGuard
32 @wxheader{recguard.h}
7c913512 33
23324ae1
FM
34 wxRecursionGuard is a very simple class which can be used to prevent reentrancy
35 problems in a function. It is not thread-safe and so should be used only in
36 single-threaded programs or in combination with some thread synchronization
37 mechanisms.
7c913512
FM
38
39 wxRecursionGuard is always used together with the
23324ae1 40 wxRecursionGuardFlag like in this example:
7c913512 41
23324ae1
FM
42 @code
43 void Foo()
44 {
45 static wxRecursionGuardFlag s_flag;
46 wxRecursionGuard guard(s_flag);
47 if ( guard.IsInside() )
48 {
49 // don't allow reentrancy
50 return;
51 }
7c913512 52
23324ae1
FM
53 ...
54 }
55 @endcode
7c913512 56
23324ae1 57 As you can see, wxRecursionGuard simply tests the flag value and sets it to
7c913512 58 @true if it hadn't been already set.
23324ae1
FM
59 wxRecursionGuard::IsInside allows testing the old flag
60 value. The advantage of using this class compared to directly manipulating the
61 flag is that the flag is always reset in the wxRecursionGuard destructor and so
62 you don't risk to forget to do it even if the function returns in an unexpected
63 way (for example because an exception has been thrown).
7c913512 64
23324ae1
FM
65 @library{wxbase}
66 @category{FIXME}
67*/
7c913512 68class wxRecursionGuard
23324ae1
FM
69{
70public:
71 /**
7c913512 72 A wxRecursionGuard object must always be initialized with a (static)
23324ae1 73 wxRecursionGuardFlag. The constructor saves the
7c913512 74 value of the flag to be able to return the correct value from
23324ae1
FM
75 IsInside().
76 */
77 wxRecursionGuard(wxRecursionGuardFlag& flag);
78
79 /**
80 The destructor resets the flag value so that the function can be entered again
81 the next time.
23324ae1
FM
82 Note that it is not virtual and so this class is not meant to be derived from
83 (besides, there is absolutely no reason to do it anyhow).
84 */
85 ~wxRecursionGuard();
86
87 /**
88 Returns @true if we're already inside the code block "protected'' by this
89 wxRecursionGuard (i.e. between this line and the end of current scope). Usually
90 the function using wxRecursionGuard takes some specific actions in such case
91 (may be simply returning) to prevent reentrant calls to itself.
23324ae1
FM
92 If this method returns @false, it is safe to continue.
93 */
328f5751 94 bool IsInside() const;
23324ae1 95};