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) { int LMDB::txn_begin(unsigned int flags, MDB_txn **ret) {
if (!isOpen) { if (!isOpen) {
MDBEnvProvider* provider = MDBEnvProvider::GetInstance(); m_env = MDBEnvProvider::GetInstance().GetEnv();
m_env = provider->GetEnv(); m_dbi = *(MDBEnvProvider::GetInstance().GetDBI());
m_dbi = *(provider->GetDBI());
isOpen = true; isOpen = true;
} }
return mdb_txn_begin(m_env, NULL, flags, ret); 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() : MDBEnvProvider::MDBEnvProvider() :
m_env(NULL), initialized(false) { m_env(NULL), initialized(false) {
pthread_mutex_init(&m_lock, NULL); 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." * "Use an MDB_env* in the process which opened it, without fork()ing."
*/ */
class MDBEnvProvider { class MDBEnvProvider {
protected:
static MDBEnvProvider* provider_;
MDBEnvProvider();
public: public:
MDBEnvProvider(MDBEnvProvider &other) = delete; MDBEnvProvider(MDBEnvProvider &other) = delete;
void operator=(const MDBEnvProvider &) = delete; void operator=(const MDBEnvProvider &) = delete;
@@ -77,11 +75,12 @@ class MDBEnvProvider {
* This is the static method that controls the access to the singleton * 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 * 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 * 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 MDBEnvProvider& GetInstance() {
static void Finalize(); static MDBEnvProvider instance;
return instance;
}
MDB_env* GetEnv(); MDB_env* GetEnv();
MDB_dbi* GetDBI(); MDB_dbi* GetDBI();
@@ -90,6 +89,7 @@ class MDBEnvProvider {
MDB_dbi m_dbi; MDB_dbi m_dbi;
pthread_mutex_t m_lock; pthread_mutex_t m_lock;
MDBEnvProvider();
bool initialized; bool initialized;
void init(); void init();
void close(); void close();

View File

@@ -106,9 +106,6 @@ ModSecurity::~ModSecurity() {
delete m_ip_collection; delete m_ip_collection;
delete m_session_collection; delete m_session_collection;
delete m_user_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 functionConst:src/utils/geo_lookup.h:49
useInitializationList:src/operators/rbl.h:69 useInitializationList:src/operators/rbl.h:69
constStatement:test/common/modsecurity_test.cc:82 constStatement:test/common/modsecurity_test.cc:82
danglingTemporaryLifetime:src/modsecurity.cc:209 danglingTemporaryLifetime:src/modsecurity.cc:206
functionStatic:src/operators/geo_lookup.h:35 functionStatic:src/operators/geo_lookup.h:35
duplicateBreak:src/operators/validate_utf8_encoding.cc duplicateBreak:src/operators/validate_utf8_encoding.cc
duplicateBranch:src/request_body_processor/multipart.cc:91 duplicateBranch:src/request_body_processor/multipart.cc:91
syntaxError:src/transaction.cc:62 syntaxError:src/transaction.cc:62
noConstructor:src/variables/variable.h:152 noConstructor:src/variables/variable.h:152
duplicateBranch:src/request_body_processor/multipart.cc:93 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/validate_url_encoding.cc:77
knownConditionTrueFalse:src/operators/verify_svnr.cc:87 knownConditionTrueFalse:src/operators/verify_svnr.cc:87
rethrowNoCurrentException:headers/modsecurity/transaction.h:307 rethrowNoCurrentException:headers/modsecurity/transaction.h:307