1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef __FRAMEWORK_THREADHELP_RESETABLEGUARD_HXX_
25 #define __FRAMEWORK_THREADHELP_RESETABLEGUARD_HXX_
26 
27 //_________________________________________________________________________________________________________________
28 //	my own includes
29 //_________________________________________________________________________________________________________________
30 
31 #include <threadhelp/inoncopyable.h>
32 #include <framework/imutex.hxx>
33 
34 //#ifndef __FRAMEWORK_THREADHELP_THREADHELPBASE_HXX_
35 //#include <threadhelp/threadhelpbase.hxx>
36 //#endif
37 
38 //_________________________________________________________________________________________________________________
39 //	interface includes
40 //_________________________________________________________________________________________________________________
41 
42 //_________________________________________________________________________________________________________________
43 //	other includes
44 //_________________________________________________________________________________________________________________
45 #include <sal/types.h>
46 
47 //_________________________________________________________________________________________________________________
48 //	namespace
49 //_________________________________________________________________________________________________________________
50 
51 namespace framework{
52 
53 //_________________________________________________________________________________________________________________
54 //	const
55 //_________________________________________________________________________________________________________________
56 
57 //_________________________________________________________________________________________________________________
58 //	declarations
59 //_________________________________________________________________________________________________________________
60 
61 /*-************************************************************************************************************//**
62 	@short          implement a guard for implementing save thread access
63 	@descr			These guard has an additional feature to well known one ::osl::Guard.
64 					You can lock() and unlock() it very often!
65 					A set bool flag inside protect this implementation against multiple lock() calls
66 					without any unlock()! So the increasing of guarded mutex couldn't be greater then 1 ...
67 
68     @attention      a) To prevent us against wrong using, the default ctor, copy ctor and the =operator are marked private!
69                     b) Use interface "IMutex" of set LockHelper only - because we must support an exclusiv locking.
70                        Interface "IRWLock" should be used by special guard implementations ... like "ReadGuard" or "WriteGuard"!
71 
72 	@implements		-
73     @base           INonCopyable
74 
75 	@devstatus		ready to use
76 *//*-*************************************************************************************************************/
77 class ResetableGuard : private INonCopyable
78 {
79 	//-------------------------------------------------------------------------------------------------------------
80 	//	public methods
81 	//-------------------------------------------------------------------------------------------------------------
82 	public:
83 
84 		/*-****************************************************************************************************//**
85 			@short		ctors
86 			@descr		Use these ctor methods to initialize the guard right.
87                         Given lock reference must be valid - otherwise crashes could occur!
88 
89 			@seealso	-
90 
91             @param      "pLock", pointer to lock helper of user
92             @param      "rLock", reference to lock helper of user
93 			@return		-
94 
95 			@onerror	-
96 		*//*-*****************************************************************************************************/
97         inline ResetableGuard( IMutex* pLock )
98             :   m_pLock    ( pLock     )
99             ,   m_bLocked  ( sal_False )
100         {
101             lock();
102         }
103 
104         //*********************************************************************************************************
105         inline ResetableGuard( IMutex& rLock )
106             :   m_pLock    ( &rLock    )
107             ,   m_bLocked  ( sal_False )
108         {
109             lock();
110         }
111 
112 		/*-****************************************************************************************************//**
113 			@short		dtor
114 			@descr		We must release set mutex if programmer forget it ...
115 
116 			@seealso	-
117 
118 			@param		-
119 			@return		-
120 
121 			@onerror	-
122 		*//*-*****************************************************************************************************/
123         inline ~ResetableGuard()
124         {
125             unlock();
126         }
127 
128 		/*-****************************************************************************************************//**
129 			@short		enable/disable the lock
130 			@descr		Use this methods to lock or unlock the mutex.
131 						You can do it so often you wish to do that ...
132 
133             @attention  We use another member to prevent us against multiple acquire calls of the same guard
134                         without suitable release calls!
135                         You don't must protect access at these bool member by using an own mutex ....
136                         because nobody use the same guard instance from different threads!
137                         It will be a function-local object every time.
138 
139 			@seealso	-
140 
141 			@param		-
142 			@return		-
143 
144 			@onerror	-
145 		*//*-*****************************************************************************************************/
146         inline void lock()
147         {
148             if( m_bLocked == sal_False )
149             {
150                 m_pLock->acquire();
151                 m_bLocked = sal_True;
152             }
153         }
154 
155         //*********************************************************************************************************
156         inline void unlock()
157         {
158             if( m_bLocked == sal_True )
159             {
160                 m_pLock->release();
161                 m_bLocked = sal_False;
162             }
163         }
164 
165 	//-------------------------------------------------------------------------------------------------------------
166 	//	private methods
167 	//-------------------------------------------------------------------------------------------------------------
168 	private:
169 
170 		/*-****************************************************************************************************//**
171 			@short		disable using of these functions!
172 			@descr		It's not allowed to use this methods. Different problems can occur otherwise.
173 						Thats why we disable it by make it private.
174 
175 			@seealso	other ctor
176 
177 			@param		-
178 			@return		-
179 
180 			@onerror	-
181 		*//*-*****************************************************************************************************/
182 		ResetableGuard();
183 
184 	//-------------------------------------------------------------------------------------------------------------
185 	//	private member
186 	//-------------------------------------------------------------------------------------------------------------
187 	private:
188 
189         IMutex*         m_pLock     ;   /// pointer to safed lock member of user
190 		sal_Bool		m_bLocked	;	/// protection against multiple lock() calls without unlock()
191 
192 };		//	class ResetableGuard
193 
194 }		//	namespace framework
195 
196 #endif	//	#ifndef __FRAMEWORK_THREADHELP_RESETABLEGUARD_HXX_
197