swtich singleton to thread safe version

This commit is contained in:
tomasz.ziolkowski 2022-04-28 07:15:02 +02:00
parent 89186b7e3a
commit 00483e4009
4 changed files with 11 additions and 31 deletions

View File

@ -42,9 +42,8 @@ LMDB::LMDB(std::string name) :
int LMDB::txn_begin(unsigned int flags, MDB_txn **ret) {
if (!isOpen) {
MDBEnvProvider* provider = MDBEnvProvider::GetInstance();
m_env = provider->GetEnv();
m_dbi = *(provider->GetDBI());
m_env = MDBEnvProvider::GetInstance().GetEnv();
m_dbi = *(MDBEnvProvider::GetInstance().GetDBI());
isOpen = true;
}
return mdb_txn_begin(m_env, NULL, flags, ret);
@ -502,22 +501,6 @@ end_txn:
}
MDBEnvProvider* MDBEnvProvider::provider_ = nullptr;
MDBEnvProvider* MDBEnvProvider::GetInstance() {
if (provider_==nullptr) {
provider_ = new MDBEnvProvider();
}
return provider_;
}
void MDBEnvProvider::Finalize() {
if (provider_!=nullptr) {
provider_->close();
provider_ = nullptr;
}
}
MDBEnvProvider::MDBEnvProvider() :
m_env(NULL), initialized(false) {
pthread_mutex_init(&m_lock, NULL);

View File

@ -66,9 +66,7 @@ namespace backend {
* "Use an MDB_env* in the process which opened it, without fork()ing."
*/
class MDBEnvProvider {
protected:
static MDBEnvProvider* provider_;
MDBEnvProvider();
public:
MDBEnvProvider(MDBEnvProvider &other) = delete;
void operator=(const MDBEnvProvider &) = delete;
@ -77,11 +75,12 @@ class MDBEnvProvider {
* This is the static method that controls the access to the singleton
* instance. On the first run, it creates a singleton object and places it
* into the static field. On subsequent runs, it returns the client existing
* object stored in the static field.
* object stored in the static field (Meyers Singleton implementation).
*/
static MDBEnvProvider* GetInstance();
static void Finalize();
static MDBEnvProvider& GetInstance() {
static MDBEnvProvider instance;
return instance;
}
MDB_env* GetEnv();
MDB_dbi* GetDBI();
@ -90,6 +89,7 @@ class MDBEnvProvider {
MDB_dbi m_dbi;
pthread_mutex_t m_lock;
MDBEnvProvider();
bool initialized;
void init();
void close();

View File

@ -106,9 +106,6 @@ ModSecurity::~ModSecurity() {
delete m_ip_collection;
delete m_session_collection;
delete m_user_collection;
#ifdef WITH_LMDB
collection::backend::MDBEnvProvider::Finalize();
#endif
}

View File

@ -44,14 +44,14 @@ functionStatic:src/engine/lua.h:71
functionConst:src/utils/geo_lookup.h:49
useInitializationList:src/operators/rbl.h:69
constStatement:test/common/modsecurity_test.cc:82
danglingTemporaryLifetime:src/modsecurity.cc:209
danglingTemporaryLifetime:src/modsecurity.cc:206
functionStatic:src/operators/geo_lookup.h:35
duplicateBreak:src/operators/validate_utf8_encoding.cc
duplicateBranch:src/request_body_processor/multipart.cc:91
syntaxError:src/transaction.cc:62
noConstructor:src/variables/variable.h:152
duplicateBranch:src/request_body_processor/multipart.cc:93
danglingTempReference:src/modsecurity.cc:209
danglingTempReference:src/modsecurity.cc:206
knownConditionTrueFalse:src/operators/validate_url_encoding.cc:77
knownConditionTrueFalse:src/operators/verify_svnr.cc:87
rethrowNoCurrentException:headers/modsecurity/transaction.h:307