Ferenc Gerlits created MINIFICPP-1753:
-----------------------------------------

             Summary: Remove the possibility of multiple initialization from 
controller services
                 Key: MINIFICPP-1753
                 URL: https://issues.apache.org/jira/browse/MINIFICPP-1753
             Project: Apache NiFi MiNiFi C++
          Issue Type: Improvement
            Reporter: Ferenc Gerlits


Quite a few controller services* use the pattern
{noformat}
void SomeService::initialize() {
  if (initialized_)
    return;

  std::lock_guard<std::mutex> lock(initialization_mutex_);
  ControllerService::initialize();
  initializeProperties();
  initialized_ = true;
}
{noformat}
with an atomic {{initialized_}} variable.  This is probably intended as an 
optimization to avoid locking the mutex, but that doesn't save much time, and 
it can lead to the initialization being run multiple times.

Put the {{if (initialized_)}} check behind the lock, and change the type of 
{{initialized_}} to a plain {{{}bool{}}}.  This will make the code simpler and 
it will make multiple initialization impossible, at the cost of making 
{{initialize()}} run slightly slower when called a second or third time.

[*] CoapConnector, JavaControllerService, MQTTControllerService, 
DatabaseService and SSLContextService do this for sure; please check if there 
are any others



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to