Skip to content

Commit

Permalink
rev
Browse files Browse the repository at this point in the history
  • Loading branch information
dr3mro committed Jan 1, 2025
1 parent 61fbd8c commit ca57540
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 21 deletions.
8 changes: 6 additions & 2 deletions src/database/database.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,20 @@
#include <trantor/utils/Logger.h>

#include <atomic>
#include <condition_variable>
#include <cstdint>
#include <jsoncons/basic_json.hpp>
#include <jsoncons/json.hpp>
#include <memory>
#include <mutex>
#include <optional>
#include <pqxx/pqxx>
#include <string>
#include <unordered_set>

#include "utils/global/types.hpp"

#define IUGUARD InUseGuard connection_guard(isConnectionInUse);
#define IUGUARD InUseGuard connection_guard(isConnectionInUse_, mtx_, cv_);

class Database
{
Expand Down Expand Up @@ -45,7 +47,9 @@ class Database
std::shared_ptr<pqxx::connection> connection;
std::string connection_info; // Store connection parameters

std::atomic<bool> isConnectionInUse;
std::atomic<bool> isConnectionInUse_;
std::mutex mtx_;
std::condition_variable cv_;

static const std::uint16_t TEXT = 1043;
static const std::uint16_t INTEGER = 23;
Expand Down
23 changes: 15 additions & 8 deletions src/database/inuseguard.cpp
Original file line number Diff line number Diff line change
@@ -1,16 +1,23 @@
#include "database/inuseguard.hpp"

#include <atomic>
#include <chrono>
#include <thread>
#include <condition_variable>
#include <mutex>

InUseGuard::InUseGuard(std::atomic<bool>& in_use) : isConnectionInUse(in_use)
InUseGuard::InUseGuard(std::atomic<bool>& in_use, std::mutex& mtx, std::condition_variable& _cv) : isConnectionInUse_(in_use), mutex_(mtx), conditionVar_(_cv)
{
std::unique_lock<std::mutex> lock(mutex_);

conditionVar_.wait(lock, [this] { return !isConnectionInUse_.load(); });

isConnectionInUse_.store(true, std::memory_order_relaxed);
}

InUseGuard::~InUseGuard()
{
while (isConnectionInUse.load())
{
std::this_thread::sleep_for(std::chrono::milliseconds(1));
std::lock_guard<std::mutex> lock(mutex_);
isConnectionInUse_.store(false, std::memory_order_relaxed);
}
isConnectionInUse.store(true);
conditionVar_.notify_all();
}

InUseGuard::~InUseGuard() { isConnectionInUse.store(false); }
22 changes: 11 additions & 11 deletions src/database/inuseguard.hpp
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
#pragma once

#include <atomic>
#include <pqxx/pqxx>
#include <condition_variable>
#include <mutex>

class InUseGuard
{
public:
InUseGuard() = delete;
InUseGuard(const InUseGuard &) = delete;
InUseGuard(InUseGuard &&) = delete;
InUseGuard &operator=(const InUseGuard &) = delete;
InUseGuard &operator=(InUseGuard &&) = delete;
InUseGuard(const InUseGuard&) = default;
InUseGuard(InUseGuard&&) = delete;
InUseGuard& operator=(const InUseGuard&) = delete;
InUseGuard& operator=(InUseGuard&&) = delete;
InUseGuard(std::atomic<bool>& in_use, std::mutex& mtx, std::condition_variable& _cv);

explicit InUseGuard(std::atomic<bool> &in_use);
virtual ~InUseGuard();
~InUseGuard();

private:
std::atomic<bool> &isConnectionInUse;
std::atomic<bool>& isConnectionInUse_;
std::mutex& mutex_;
std::condition_variable& conditionVar_;
};

0 comments on commit ca57540

Please sign in to comment.