Skip to content

Commit 41a47df

Browse files
authored
Merge pull request #508 from aregtech/feature/507-reference-counter-for-log-observer
Add reference counter to the log observer
2 parents bf871c2 + 87af37a commit 41a47df

1 file changed

Lines changed: 63 additions & 54 deletions

File tree

framework/areglogger/client/private/LogObserverApi.cpp

Lines changed: 63 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -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

104109
LOGGER_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

120127
LOGGER_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

137144
LOGGER_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

150157
LOGGER_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

164171
LOGGER_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

193200
LOGGER_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

199206
LOGGER_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

214224
LOGGER_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

220230
LOGGER_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

233243
LOGGER_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

239249
LOGGER_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

252262
LOGGER_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

265275
LOGGER_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

278288
LOGGER_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

295305
LOGGER_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()
308318
LOGGER_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()
320330
LOGGER_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 */)
332342
LOGGER_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
350360
LOGGER_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

Comments
 (0)