1
0
mirror of https://github.com/codership/wsrep-lib.git synced 2025-06-14 15:02:27 +03:00

Made trrep::mutex abstract class in order to allow DBMS integrations

to define their own instrumented mutex types.
This commit is contained in:
Teemu Ollakka
2018-04-18 12:14:10 +03:00
parent 7e5d2d3606
commit c1fb9014ce
4 changed files with 42 additions and 22 deletions

View File

@ -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_;

View File

@ -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() { }

View File

@ -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_;
};
}

View File

@ -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(