From c1fb9014ce75a423e8ba50d7401901fce711f6a0 Mon Sep 17 00:00:00 2001 From: Teemu Ollakka Date: Wed, 18 Apr 2018 12:14:10 +0300 Subject: [PATCH] Made trrep::mutex abstract class in order to allow DBMS integrations to define their own instrumented mutex types. --- src/client_context.hpp | 10 +++++++--- src/mock_server_context.hpp | 6 ++++-- src/mutex.hpp | 27 ++++++++++++++++++++------- src/transaction_context_test.cpp | 21 +++++++++++---------- 4 files changed, 42 insertions(+), 22 deletions(-) diff --git a/src/client_context.hpp b/src/client_context.hpp index a8bc67b..7848b1e 100644 --- a/src/client_context.hpp +++ b/src/client_context.hpp @@ -53,10 +53,14 @@ namespace trrep s_quitting }; - client_context(trrep::server_context& server_context, + // + // Client context constuctor + // + client_context(trrep::mutex& mutex, + trrep::server_context& server_context, client_id id, enum mode mode) - : mutex_() + : mutex_(mutex) , server_context_(server_context) , id_(id) , mode_(mode) @@ -130,7 +134,7 @@ namespace trrep void state(enum state state); - trrep::mutex mutex_; + trrep::mutex& mutex_; trrep::server_context& server_context_; client_id id_; enum mode mode_; diff --git a/src/mock_server_context.hpp b/src/mock_server_context.hpp index c8ca3bb..e26c9f2 100644 --- a/src/mock_server_context.hpp +++ b/src/mock_server_context.hpp @@ -6,8 +6,10 @@ #define TRREP_MOCK_SERVER_CONTEXT_HPP #include "server_context.hpp" +#include "mock_client_context.hpp" #include "mock_provider_impl.hpp" + namespace trrep { class mock_server_context : public trrep::server_context @@ -27,8 +29,8 @@ namespace trrep { return mock_provider_impl_; } trrep::client_context* local_client_context() { - return new trrep::client_context(*this, ++last_client_id_, - trrep::client_context::m_local); + return new trrep::mock_client_context(*this, ++last_client_id_, + trrep::client_context::m_local); } void on_connect() { } diff --git a/src/mutex.hpp b/src/mutex.hpp index ec33b7e..5968101 100644 --- a/src/mutex.hpp +++ b/src/mutex.hpp @@ -11,20 +11,35 @@ namespace trrep { - // Default pthread implementation - + //! + //! + //! class mutex { public: - mutex() - : mutex_() + mutex() { } + virtual ~mutex() { } + virtual void lock() = 0; + virtual void unlock() = 0; + private: + mutex(const mutex& other); + mutex& operator=(const mutex& other); + }; + + // Default pthread implementation + class default_mutex : public trrep::mutex + { + public: + default_mutex() + : trrep::mutex(), + mutex_() { if (pthread_mutex_init(&mutex_, 0)) { throw trrep::runtime_error("mutex init failed"); } } - ~mutex() + ~default_mutex() { if (pthread_mutex_destroy(&mutex_)) { @@ -48,8 +63,6 @@ namespace trrep } } private: - mutex(const mutex& other); - mutex& operator=(const mutex& other); pthread_mutex_t mutex_; }; } diff --git a/src/transaction_context_test.cpp b/src/transaction_context_test.cpp index 4332eb7..f7f49dd 100644 --- a/src/transaction_context_test.cpp +++ b/src/transaction_context_test.cpp @@ -3,7 +3,7 @@ // #include "transaction_context.hpp" -#include "client_context.hpp" +#include "mock_client_context.hpp" #include "mock_server_context.hpp" #include "provider.hpp" #include "mock_provider_impl.hpp" @@ -58,7 +58,8 @@ BOOST_AUTO_TEST_CASE(transaction_context_1pc) { trrep::mock_server_context sc("s1", "s1", trrep::server_context::rm_sync); - trrep::client_context cc(sc, trrep::client_id(1), trrep::client_context::m_replicating); + trrep::mock_client_context cc(sc,trrep::client_id(1), + trrep::client_context::m_replicating); trrep::transaction_context tc(cc); // Verify initial state @@ -98,7 +99,7 @@ BOOST_AUTO_TEST_CASE(transaction_context_2pc) { trrep::mock_server_context sc("s1", "s1", trrep::server_context::rm_sync); - trrep::client_context cc(sc, trrep::client_id(1), trrep::client_context::m_replicating); + trrep::mock_client_context cc(sc, trrep::client_id(1), trrep::client_context::m_replicating); trrep::transaction_context tc(cc); // Verify initial state @@ -145,7 +146,7 @@ BOOST_AUTO_TEST_CASE(transaction_context_1pc_bf_before_before_commit) { trrep::mock_server_context sc("s1", "s1", trrep::server_context::rm_sync); - trrep::client_context cc(sc, trrep::client_id(1), trrep::client_context::m_replicating); + trrep::mock_client_context cc(sc, trrep::client_id(1), trrep::client_context::m_replicating); trrep::transaction_context tc(cc); // Verify initial state @@ -186,7 +187,7 @@ BOOST_AUTO_TEST_CASE(transaction_context_2pc_bf_before_before_prepare) { trrep::mock_server_context sc("s1", "s1", trrep::server_context::rm_sync); - trrep::client_context cc(sc, trrep::client_id(1), trrep::client_context::m_replicating); + trrep::mock_client_context cc(sc, trrep::client_id(1), trrep::client_context::m_replicating); trrep::transaction_context tc(cc); // Verify initial state @@ -227,7 +228,7 @@ BOOST_AUTO_TEST_CASE(transaction_context_2pc_bf_before_after_prepare) { trrep::mock_server_context sc("s1", "s1", trrep::server_context::rm_sync); - trrep::client_context cc(sc, trrep::client_id(1), trrep::client_context::m_replicating); + trrep::mock_client_context cc(sc, trrep::client_id(1), trrep::client_context::m_replicating); trrep::transaction_context tc(cc); // Verify initial state @@ -273,7 +274,7 @@ BOOST_AUTO_TEST_CASE(transaction_context_1pc_bf_during_before_commit_uncertified { trrep::mock_server_context sc("s1", "s1", trrep::server_context::rm_sync); - trrep::client_context cc(sc, trrep::client_id(1), trrep::client_context::m_replicating); + trrep::mock_client_context cc(sc, trrep::client_id(1), trrep::client_context::m_replicating); trrep::transaction_context tc(cc); // Verify initial state @@ -316,7 +317,7 @@ BOOST_AUTO_TEST_CASE(transaction_context_1pc_bf_during_before_commit_certified) { trrep::mock_server_context sc("s1", "s1", trrep::server_context::rm_sync); - trrep::client_context cc(sc, trrep::client_id(1), trrep::client_context::m_replicating); + trrep::mock_client_context cc(sc, trrep::client_id(1), trrep::client_context::m_replicating); trrep::transaction_context tc(cc); // Verify initial state @@ -354,7 +355,7 @@ BOOST_AUTO_TEST_CASE(transaction_context_1pc_applying) { trrep::mock_server_context sc("s1", "s1", trrep::server_context::rm_sync); - trrep::client_context cc(sc, + trrep::mock_client_context cc(sc, trrep::client_id(1), trrep::client_context::m_applier); trrep::transaction_context tc(applying_transaction( @@ -379,7 +380,7 @@ BOOST_AUTO_TEST_CASE(transaction_context_2pc_applying) { trrep::mock_server_context sc("s1", "s1", trrep::server_context::rm_sync); - trrep::client_context cc(sc, + trrep::mock_client_context cc(sc, trrep::client_id(1), trrep::client_context::m_applier); trrep::transaction_context tc(applying_transaction(