void MDBEnv::incROTX()
{
- std::lock_guard<std::mutex> l(d_countmutex);
- ++d_ROtransactionsOut[std::this_thread::get_id()];
+ auto threadId = std::this_thread::get_id();
+ {
+ std::shared_lock<std::shared_mutex> lock(d_countmutex);
+ if (auto transactionsIt = d_ROtransactionsOut.find(threadId); transactionsIt != d_ROtransactionsOut.end()) {
+ ++transactionsIt->second;
+ return;
+ }
+ }
+
+ {
+ std::unique_lock<std::shared_mutex> lock(d_countmutex);
+ auto [transactionsIt, inserted] = d_ROtransactionsOut.emplace(threadId, 1);
+ if (!inserted) {
+ ++transactionsIt->second;
+ }
+ }
}
void MDBEnv::decROTX()
{
- std::lock_guard<std::mutex> l(d_countmutex);
- --d_ROtransactionsOut[std::this_thread::get_id()];
+ auto threadId = std::this_thread::get_id();
+ {
+ std::shared_lock<std::shared_mutex> lock(d_countmutex);
+ d_ROtransactionsOut.at(threadId)--;
+ }
}
void MDBEnv::incRWTX()
{
- std::lock_guard<std::mutex> l(d_countmutex);
- ++d_RWtransactionsOut[std::this_thread::get_id()];
+ auto threadId = std::this_thread::get_id();
+ {
+ std::shared_lock<std::shared_mutex> lock(d_countmutex);
+ if (auto transactionsIt = d_RWtransactionsOut.find(threadId); transactionsIt != d_RWtransactionsOut.end()) {
+ ++transactionsIt->second;
+ return;
+ }
+ }
+
+ {
+ std::unique_lock<std::shared_mutex> lock(d_countmutex);
+ auto [transactionsIt, inserted] = d_RWtransactionsOut.emplace(threadId, 1);
+ if (!inserted) {
+ ++transactionsIt->second;
+ }
+ }
}
void MDBEnv::decRWTX()
{
- std::lock_guard<std::mutex> l(d_countmutex);
- --d_RWtransactionsOut[std::this_thread::get_id()];
+ auto threadId = std::this_thread::get_id();
+ {
+ std::shared_lock<std::shared_mutex> lock(d_countmutex);
+ d_RWtransactionsOut.at(threadId)--;
+ }
}
int MDBEnv::getRWTX()
{
- std::lock_guard<std::mutex> l(d_countmutex);
- return d_RWtransactionsOut[std::this_thread::get_id()];
+ auto threadId = std::this_thread::get_id();
+ {
+ std::shared_lock<std::shared_mutex> lock(d_countmutex);
+ if (auto transactionsIt = d_RWtransactionsOut.find(threadId); transactionsIt != d_RWtransactionsOut.end()) {
+ return transactionsIt->second.load();
+ }
+ }
+ return 0;
}
+
int MDBEnv::getROTX()
{
- std::lock_guard<std::mutex> l(d_countmutex);
- return d_ROtransactionsOut[std::this_thread::get_id()];
+ auto threadId = std::this_thread::get_id();
+ {
+ std::shared_lock<std::shared_mutex> lock(d_countmutex);
+ if (auto transactionsIt = d_RWtransactionsOut.find(threadId); transactionsIt != d_RWtransactionsOut.end()) {
+ return transactionsIt->second.load();
+ }
+ }
+ return 0;
}
#include <mutex>
#include <vector>
#include <algorithm>
+#include <shared_mutex>
#include <string>
#include <string_view>
#include <atomic>
void decROTX();
private:
std::mutex d_openmut;
- std::mutex d_countmutex;
- std::map<std::thread::id, int> d_RWtransactionsOut;
- std::map<std::thread::id, int> d_ROtransactionsOut;
+ std::shared_mutex d_countmutex;
+ std::map<std::thread::id, std::atomic<int>> d_RWtransactionsOut;
+ std::map<std::thread::id, std::atomic<int>> d_ROtransactionsOut;
};
std::shared_ptr<MDBEnv> getMDBEnv(const char* fname, int flags, int mode, uint64_t mapsizeMB);