Skip to content

Commit ca57540

Browse files
committed
rev
1 parent 61fbd8c commit ca57540

File tree

3 files changed

+32
-21
lines changed

3 files changed

+32
-21
lines changed

src/database/database.hpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,20 @@
55
#include <trantor/utils/Logger.h>
66

77
#include <atomic>
8+
#include <condition_variable>
89
#include <cstdint>
910
#include <jsoncons/basic_json.hpp>
1011
#include <jsoncons/json.hpp>
1112
#include <memory>
13+
#include <mutex>
1214
#include <optional>
1315
#include <pqxx/pqxx>
1416
#include <string>
1517
#include <unordered_set>
1618

1719
#include "utils/global/types.hpp"
1820

19-
#define IUGUARD InUseGuard connection_guard(isConnectionInUse);
21+
#define IUGUARD InUseGuard connection_guard(isConnectionInUse_, mtx_, cv_);
2022

2123
class Database
2224
{
@@ -45,7 +47,9 @@ class Database
4547
std::shared_ptr<pqxx::connection> connection;
4648
std::string connection_info; // Store connection parameters
4749

48-
std::atomic<bool> isConnectionInUse;
50+
std::atomic<bool> isConnectionInUse_;
51+
std::mutex mtx_;
52+
std::condition_variable cv_;
4953

5054
static const std::uint16_t TEXT = 1043;
5155
static const std::uint16_t INTEGER = 23;

src/database/inuseguard.cpp

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,23 @@
11
#include "database/inuseguard.hpp"
22

33
#include <atomic>
4-
#include <chrono>
5-
#include <thread>
4+
#include <condition_variable>
5+
#include <mutex>
66

7-
InUseGuard::InUseGuard(std::atomic<bool>& in_use) : isConnectionInUse(in_use)
7+
InUseGuard::InUseGuard(std::atomic<bool>& in_use, std::mutex& mtx, std::condition_variable& _cv) : isConnectionInUse_(in_use), mutex_(mtx), conditionVar_(_cv)
8+
{
9+
std::unique_lock<std::mutex> lock(mutex_);
10+
11+
conditionVar_.wait(lock, [this] { return !isConnectionInUse_.load(); });
12+
13+
isConnectionInUse_.store(true, std::memory_order_relaxed);
14+
}
15+
16+
InUseGuard::~InUseGuard()
817
{
9-
while (isConnectionInUse.load())
1018
{
11-
std::this_thread::sleep_for(std::chrono::milliseconds(1));
19+
std::lock_guard<std::mutex> lock(mutex_);
20+
isConnectionInUse_.store(false, std::memory_order_relaxed);
1221
}
13-
isConnectionInUse.store(true);
22+
conditionVar_.notify_all();
1423
}
15-
16-
InUseGuard::~InUseGuard() { isConnectionInUse.store(false); }

src/database/inuseguard.hpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
1-
#pragma once
2-
31
#include <atomic>
4-
#include <pqxx/pqxx>
2+
#include <condition_variable>
3+
#include <mutex>
54

65
class InUseGuard
76
{
87
public:
9-
InUseGuard() = delete;
10-
InUseGuard(const InUseGuard &) = delete;
11-
InUseGuard(InUseGuard &&) = delete;
12-
InUseGuard &operator=(const InUseGuard &) = delete;
13-
InUseGuard &operator=(InUseGuard &&) = delete;
8+
InUseGuard(const InUseGuard&) = default;
9+
InUseGuard(InUseGuard&&) = delete;
10+
InUseGuard& operator=(const InUseGuard&) = delete;
11+
InUseGuard& operator=(InUseGuard&&) = delete;
12+
InUseGuard(std::atomic<bool>& in_use, std::mutex& mtx, std::condition_variable& _cv);
1413

15-
explicit InUseGuard(std::atomic<bool> &in_use);
16-
virtual ~InUseGuard();
14+
~InUseGuard();
1715

1816
private:
19-
std::atomic<bool> &isConnectionInUse;
17+
std::atomic<bool>& isConnectionInUse_;
18+
std::mutex& mutex_;
19+
std::condition_variable& conditionVar_;
2020
};

0 commit comments

Comments
 (0)