@@ -39,12 +39,17 @@ namespace
3939{
4040 struct sLogObserverStruct
4141 {
42+ // / The mutex to protect the log observer state and counter
4243 Mutex losLock { false };
44+ // / The log observer initialized counter
45+ uint32_t losCounter { 0 };
46+ // / The log observer state
4347 eObserverStates losState { eObserverStates::ObserverUninitialized };
48+ // / The log observer events
4449 sObserverEvents losEvents { };
4550 };
4651
47- sLogObserverStruct theObserver ;
52+ sLogObserverStruct _theObserver ;
4853
4954 void _setCallbacks (sObserverEvents & dstCallbacks, const sObserverEvents * srcCallbacks)
5055 {
@@ -103,58 +108,60 @@ namespace
103108
104109LOGGER_API_IMPL bool logObserverInitialize (const sObserverEvents * callbacks, const char * configFilePath /* = nullptr */ )
105110{
106- Lock lock (theObserver .losLock );
111+ Lock lock (_theObserver .losLock );
107112
108- if (_isInitialized (theObserver.losState ) == false )
113+ ++_theObserver.losCounter ;
114+
115+ if (_isInitialized (_theObserver.losState ) == false )
109116 {
110117 LoggerClient& client = LoggerClient::getInstance ();
111- theObserver .losState = eObserverStates::ObserverDisconnected;
112- _setCallbacks (theObserver .losEvents , callbacks);
113- client.setCallbacks (&theObserver .losEvents );
118+ _theObserver .losState = eObserverStates::ObserverDisconnected;
119+ _setCallbacks (_theObserver .losEvents , callbacks);
120+ client.setCallbacks (&_theObserver .losEvents );
114121 Application::initApplication (true , false , false , true , false , configFilePath, static_cast <IEConfigurationListener *>(&client));
115122 }
116123
117- return _isInitialized (theObserver .losState );
124+ return _isInitialized (_theObserver .losState );
118125}
119126
120127LOGGER_API_IMPL bool logObserverConnectLogger (const char * dbPath, const char * ipAddress /* = nullptr*/ , uint16_t portNr /* = 0 */ )
121128{
122- Lock lock (theObserver .losLock );
129+ Lock lock (_theObserver .losLock );
123130
124- if (_isDisconnected (theObserver .losState ))
131+ if (_isDisconnected (_theObserver .losState ))
125132 {
126133 LoggerClient& client = LoggerClient::getInstance ();
127134 client.openLoggingDatabase (dbPath);
128135 if (client.startLoggerClient (ipAddress, portNr))
129136 {
130- theObserver .losState = eObserverStates::ObserverConnected;
137+ _theObserver .losState = eObserverStates::ObserverConnected;
131138 }
132139 }
133140
134- return _isConnected (theObserver .losState );
141+ return _isConnected (_theObserver .losState );
135142}
136143
137144LOGGER_API_IMPL void logObserverDisconnectLogger ()
138145{
139- Lock lock (theObserver .losLock );
146+ Lock lock (_theObserver .losLock );
140147
141- if (_isConnected (theObserver .losState ))
148+ if (_isConnected (_theObserver .losState ))
142149 {
143150 LoggerClient& client = LoggerClient::getInstance ();
144151 client.stopLoggerClient ();
145152 client.closeLoggingDatabase ();
146- theObserver .losState = eObserverStates::ObserverDisconnected;
153+ _theObserver .losState = eObserverStates::ObserverDisconnected;
147154 }
148155}
149156
150157LOGGER_API_IMPL bool logObserverPauseLogging (bool doPause)
151158{
152- Lock lock (theObserver .losLock );
159+ Lock lock (_theObserver .losLock );
153160
154- bool result{ _isInitialized (theObserver .losState ) };
155- if (_isConnected (theObserver .losState ))
161+ bool result{ _isInitialized (_theObserver .losState ) };
162+ if (_isConnected (_theObserver .losState ))
156163 {
157- theObserver .losState = doPause ? eObserverStates::ObserverPaused : eObserverStates::ObserverConnected;
164+ _theObserver .losState = doPause ? eObserverStates::ObserverPaused : eObserverStates::ObserverConnected;
158165 LoggerClient::getInstance ().setPaused (doPause);
159166 }
160167
@@ -163,14 +170,14 @@ LOGGER_API_IMPL bool logObserverPauseLogging(bool doPause)
163170
164171LOGGER_API_IMPL bool logObserverStopLogging (bool doStop, const char * dbPath /* = NULL*/ )
165172{
166- Lock lock (theObserver .losLock );
173+ Lock lock (_theObserver .losLock );
167174 bool result{ false };
168- if (_isConnected (theObserver .losState ))
175+ if (_isConnected (_theObserver .losState ))
169176 {
170177 LoggerClient& client = LoggerClient::getInstance ();
171178 if (doStop)
172179 {
173- theObserver .losState = eObserverStates::ObserverPaused;
180+ _theObserver .losState = eObserverStates::ObserverPaused;
174181 client.setPaused (true );
175182 client.closeLoggingDatabase ();
176183 result = true ;
@@ -179,7 +186,7 @@ LOGGER_API_IMPL bool logObserverStopLogging(bool doStop, const char* dbPath /* =
179186 {
180187 if (client.openLoggingDatabase (dbPath))
181188 {
182- theObserver .losState = eObserverStates::ObserverConnected;
189+ _theObserver .losState = eObserverStates::ObserverConnected;
183190 client.setPaused (false );
184191 result = true ;
185192 }
@@ -192,36 +199,39 @@ LOGGER_API_IMPL bool logObserverStopLogging(bool doStop, const char* dbPath /* =
192199
193200LOGGER_API_IMPL eObserverStates logObserverCurrentState ()
194201{
195- Lock lock (theObserver .losLock );
196- return theObserver .losState ;
202+ Lock lock (_theObserver .losLock );
203+ return _theObserver .losState ;
197204}
198205
199206LOGGER_API_IMPL void logObserverRelease ()
200207{
201- Lock lock (theObserver.losLock );
208+ Lock lock (_theObserver.losLock );
209+
210+ if (_theObserver.losCounter != 0 )
211+ --_theObserver.losCounter ;
202212
203- if (_isInitialized (theObserver .losState ))
213+ if ((_theObserver. losCounter == 0 ) && _isInitialized (_theObserver .losState ))
204214 {
205215 LoggerClient& client = LoggerClient::getInstance ();
206216 client.setCallbacks (nullptr );
207217 client.stopLoggerClient ();
208218 Application::releaseApplication ();
209- _setCallbacks (theObserver .losEvents , nullptr );
210- theObserver .losState = eObserverStates::ObserverUninitialized;
219+ _setCallbacks (_theObserver .losEvents , nullptr );
220+ _theObserver .losState = eObserverStates::ObserverUninitialized;
211221 }
212222}
213223
214224LOGGER_API_IMPL bool logObserverIsInitialized ()
215225{
216- Lock lock (theObserver .losLock );
217- return _isInitialized (theObserver .losState );
226+ Lock lock (_theObserver .losLock );
227+ return _isInitialized (_theObserver .losState );
218228}
219229
220230LOGGER_API_IMPL bool logObserverIsConnected ()
221231{
222- Lock lock (theObserver .losLock );
232+ Lock lock (_theObserver .losLock );
223233 bool result{ false };
224- if (_isInitialized (theObserver .losState ))
234+ if (_isInitialized (_theObserver .losState ))
225235 {
226236 LoggerClient& client = LoggerClient::getInstance ();
227237 result = client.isConnectedState ();
@@ -232,15 +242,15 @@ LOGGER_API_IMPL bool logObserverIsConnected()
232242
233243LOGGER_API_IMPL bool logObserverIsStarted ()
234244{
235- Lock lock (theObserver .losLock );
236- return _isStarted (theObserver .losState );
245+ Lock lock (_theObserver .losLock );
246+ return _isStarted (_theObserver .losState );
237247}
238248
239249LOGGER_API_IMPL const char * logObserverLoggerAddress ()
240250{
241- Lock lock (theObserver .losLock );
251+ Lock lock (_theObserver .losLock );
242252 const char * result{ nullptr };
243- if (_isInitialized (theObserver .losState ))
253+ if (_isInitialized (_theObserver .losState ))
244254 {
245255 LoggerClient& client = LoggerClient::getInstance ();
246256 result = client.getAddress ().getHostAddress ().getString ();
@@ -251,9 +261,9 @@ LOGGER_API_IMPL const char* logObserverLoggerAddress()
251261
252262LOGGER_API_IMPL unsigned short logObserverLoggerPort ()
253263{
254- Lock lock (theObserver .losLock );
264+ Lock lock (_theObserver .losLock );
255265 unsigned short result{ NESocket::InvalidPort };
256- if (_isInitialized (theObserver .losState ))
266+ if (_isInitialized (_theObserver .losState ))
257267 {
258268 LoggerClient& client = LoggerClient::getInstance ();
259269 result = client.getAddress ().getHostPort ();
@@ -264,9 +274,9 @@ LOGGER_API_IMPL unsigned short logObserverLoggerPort()
264274
265275LOGGER_API_IMPL bool logObserverConfigLoggerEnabled ()
266276{
267- Lock lock (theObserver .losLock );
277+ Lock lock (_theObserver .losLock );
268278 bool result{ false };
269- if (_isInitialized (theObserver .losState ))
279+ if (_isInitialized (_theObserver .losState ))
270280 {
271281 LoggerClient& client = LoggerClient::getInstance ();
272282 result = client.isConfigLoggerConnectEnabled ();
@@ -277,9 +287,9 @@ LOGGER_API_IMPL bool logObserverConfigLoggerEnabled()
277287
278288LOGGER_API_IMPL bool logObserverConfigLoggerAddress (char * addrBuffer, uint32_t space)
279289{
280- Lock lock (theObserver .losLock );
290+ Lock lock (_theObserver .losLock );
281291 bool result{ false };
282- if (_isInitialized (theObserver .losState ))
292+ if (_isInitialized (_theObserver .losState ))
283293 {
284294 LoggerClient& client = LoggerClient::getInstance ();
285295 String addr{ client.getConfigLoggerAddress () };
@@ -294,9 +304,9 @@ LOGGER_API_IMPL bool logObserverConfigLoggerAddress(char* addrBuffer, uint32_t s
294304
295305LOGGER_API_IMPL unsigned short logObserverConfigLoggerPort ()
296306{
297- Lock lock (theObserver .losLock );
307+ Lock lock (_theObserver .losLock );
298308 uint16_t result{ NESocket::InvalidPort };
299- if (_isInitialized (theObserver .losState ))
309+ if (_isInitialized (_theObserver .losState ))
300310 {
301311 LoggerClient& client = LoggerClient::getInstance ();
302312 result = client.getConfigLoggerPort ();
@@ -308,8 +318,8 @@ LOGGER_API_IMPL unsigned short logObserverConfigLoggerPort()
308318LOGGER_API_IMPL bool logObserverRequestInstances ()
309319{
310320 bool result{ false };
311- Lock lock (theObserver .losLock );
312- if (_isInitialized (theObserver .losState ))
321+ Lock lock (_theObserver .losLock );
322+ if (_isInitialized (_theObserver .losState ))
313323 {
314324 result = LoggerClient::getInstance ().requestConnectedInstances ();
315325 }
@@ -320,8 +330,8 @@ LOGGER_API_IMPL bool logObserverRequestInstances()
320330LOGGER_API_IMPL bool logObserverRequestScopes (ITEM_ID target /* = ID_IGNORED */ )
321331{
322332 bool result{ false };
323- Lock lock (theObserver .losLock );
324- if (_isInitialized (theObserver .losState ))
333+ Lock lock (_theObserver .losLock );
334+ if (_isInitialized (_theObserver .losState ))
325335 {
326336 result = LoggerClient::getInstance ().requestScopes (target);
327337 }
@@ -332,8 +342,8 @@ LOGGER_API_IMPL bool logObserverRequestScopes(ITEM_ID target /* = ID_IGNORED */)
332342LOGGER_API_IMPL bool logObserverRequestChangeScopePrio (ITEM_ID target, const sLogScope * scopes, uint32_t count)
333343{
334344 bool result{ false };
335- Lock lock (theObserver .losLock );
336- if (_isInitialized (theObserver .losState ) && (target != ID_IGNORE))
345+ Lock lock (_theObserver .losLock );
346+ if (_isInitialized (_theObserver .losState ) && (target != ID_IGNORE))
337347 {
338348 NELogging::ScopeNames scopeList (count);
339349 for (uint32_t i = 0 ; i < count; ++i)
@@ -350,8 +360,8 @@ LOGGER_API_IMPL bool logObserverRequestChangeScopePrio(ITEM_ID target, const sLo
350360LOGGER_API_IMPL bool logObserverRequestSaveConfig (ITEM_ID target /* = ID_IGNORED */ )
351361{
352362 bool result{ false };
353- Lock lock (theObserver .losLock );
354- if (_isInitialized (theObserver .losState ))
363+ Lock lock (_theObserver .losLock );
364+ if (_isInitialized (_theObserver .losState ))
355365 {
356366 result = LoggerClient::getInstance ().requestSaveConfiguration (target);
357367 }
@@ -404,8 +414,7 @@ LOGGER_API_IMPL bool logObserverConfigUpdate(const char* address, uint16_t port,
404414 bool result{ false };
405415 if (logger.setConfigLoggerConnection (address, port) && logger.setConfigDatabasePath (dbFilePath, true ))
406416 {
407- result = true ;
408- logger.saveConfiguration ();
417+ result = makeSave ? logger.requestSaveConfiguration () : true ;
409418 }
410419
411420 return result;
0 commit comments