mirror of
https://github.com/codership/wsrep-lib.git
synced 2025-07-28 20:02:00 +03:00
Introduce non-locking variant of client_state::cleanup()
The method takes already locked lock object as an argument. The caller must ensure that the lock object owns the underlying mutex. Replaced homegrown wsrep::unique_lock with type alias from std::unique_lock.
This commit is contained in:
@ -193,6 +193,13 @@ namespace wsrep
|
|||||||
* The state is changed to s_none.
|
* The state is changed to s_none.
|
||||||
*/
|
*/
|
||||||
void cleanup();
|
void cleanup();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overload of cleanup() method which takes lock as argument.
|
||||||
|
* This method does not release the lock during execution, but
|
||||||
|
* the lock is needed for debug build sanity checks.
|
||||||
|
*/
|
||||||
|
void cleanup(wsrep::unique_lock<wsrep::mutex>& lock);
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
/** @name Client command handling */
|
/** @name Client command handling */
|
||||||
|
@ -74,7 +74,7 @@ namespace wsrep
|
|||||||
{
|
{
|
||||||
if (pthread_cond_wait(
|
if (pthread_cond_wait(
|
||||||
&cond_,
|
&cond_,
|
||||||
reinterpret_cast<pthread_mutex_t*>(lock.mutex().native())))
|
reinterpret_cast<pthread_mutex_t*>(lock.mutex()->native())))
|
||||||
{
|
{
|
||||||
throw wsrep::runtime_error("Cond wait failed");
|
throw wsrep::runtime_error("Cond wait failed");
|
||||||
}
|
}
|
||||||
|
@ -20,57 +20,12 @@
|
|||||||
#ifndef WSREP_LOCK_HPP
|
#ifndef WSREP_LOCK_HPP
|
||||||
#define WSREP_LOCK_HPP
|
#define WSREP_LOCK_HPP
|
||||||
|
|
||||||
#include "mutex.hpp"
|
#include <mutex>
|
||||||
|
|
||||||
#include <cassert>
|
|
||||||
|
|
||||||
namespace wsrep
|
namespace wsrep
|
||||||
{
|
{
|
||||||
template <class M>
|
template <class C>
|
||||||
class unique_lock
|
using unique_lock = std::unique_lock<C>;
|
||||||
{
|
|
||||||
public:
|
|
||||||
unique_lock(M& mutex)
|
|
||||||
: mutex_(mutex)
|
|
||||||
, locked_(false)
|
|
||||||
{
|
|
||||||
mutex_.lock();
|
|
||||||
locked_ = true;
|
|
||||||
}
|
|
||||||
~unique_lock()
|
|
||||||
{
|
|
||||||
if (locked_)
|
|
||||||
{
|
|
||||||
unlock();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void lock()
|
|
||||||
{
|
|
||||||
mutex_.lock();
|
|
||||||
assert(locked_ == false);
|
|
||||||
locked_ = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void unlock()
|
|
||||||
{
|
|
||||||
assert(locked_);
|
|
||||||
locked_ = false;
|
|
||||||
mutex_.unlock();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool owns_lock() const
|
|
||||||
{
|
|
||||||
return locked_;
|
|
||||||
}
|
|
||||||
|
|
||||||
M& mutex() { return mutex_; }
|
|
||||||
private:
|
|
||||||
unique_lock(const unique_lock&);
|
|
||||||
unique_lock& operator=(const unique_lock&);
|
|
||||||
M& mutex_;
|
|
||||||
bool locked_;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // WSREP_LOCK_HPP
|
#endif // WSREP_LOCK_HPP
|
||||||
|
@ -69,6 +69,11 @@ void wsrep::client_state::close()
|
|||||||
void wsrep::client_state::cleanup()
|
void wsrep::client_state::cleanup()
|
||||||
{
|
{
|
||||||
wsrep::unique_lock<wsrep::mutex> lock(mutex_);
|
wsrep::unique_lock<wsrep::mutex> lock(mutex_);
|
||||||
|
cleanup(lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wsrep::client_state::cleanup(wsrep::unique_lock<wsrep::mutex>& lock)
|
||||||
|
{
|
||||||
debug_log_state("cleanup: enter");
|
debug_log_state("cleanup: enter");
|
||||||
state(lock, s_none);
|
state(lock, s_none);
|
||||||
debug_log_state("cleanup: leave");
|
debug_log_state("cleanup: leave");
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include "wsrep/logger.hpp"
|
#include "wsrep/logger.hpp"
|
||||||
#include "v26/wsrep_thread_service.h"
|
#include "v26/wsrep_thread_service.h"
|
||||||
|
|
||||||
|
#include <cassert>
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
#include <cerrno>
|
#include <cerrno>
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user