MaxScale/include/maxscale/spinlock.hh
Markus Mäkelä 4a179d973b MXS-1354: Add missing locking to the Users class
The Users class now performs locking when a method is called. This will
prevent concurrent access to the internal map of users.

Added missing const versions of SpinLockGuard.
2017-08-18 10:28:20 +03:00

122 lines
2.5 KiB
C++

#pragma once
/*
* Copyright (c) 2016 MariaDB Corporation Ab
*
* Use of this software is governed by the Business Source License included
* in the LICENSE.TXT file and at www.mariadb.com/bsl11.
*
* Change Date: 2020-01-01
*
* On the date above, in accordance with the Business Source License, use
* of this software will be governed by version 2 or later of the General
* Public License.
*/
#include <maxscale/cppdefs.hh>
#include <maxscale/spinlock.h>
namespace maxscale
{
class SpinLockGuard;
/**
* @class SpinLock spinlock.hh <maxscale/spinlock.hh>
*
* The class SpinLock is a simple class that wraps a regular SPINLOCK
* and provides equivalent functionality.
*/
class SpinLock
{
public:
friend class SpinLockGuard;
/**
* Creates a spinlock.
*/
SpinLock()
{
spinlock_init(&m_lock);
}
~SpinLock()
{
}
/**
* Acquires the spinlock.
*/
void acquire() const
{
spinlock_acquire(&m_lock);
}
/**
* Releases the spinlock.
*/
void release() const
{
spinlock_release(&m_lock);
}
private:
SpinLock(const SpinLock&) /* = delete */;
SpinLock& operator = (const SpinLock&) /* = delete */;
private:
mutable SPINLOCK m_lock;
};
/**
* @class SpinLockGuard spinlock.hh <maxscale/spinlock.hh>
*
* The class SpinLockGuard is a spinlock wrapper that provides a RAII-style
* mechanism for owning a spinlock for the duration of a scoped block. When
* a SpinLockGuard object is created, it attempts to take ownership of the
* spinlock it is given. When control leaves the scope in which the
* SpinLockGuard object was created, the SpinLockGuard is destructed and the
* mutex is released.
*/
class SpinLockGuard
{
public:
/**
* Creates the guard and locks the provided lock.
*
* @param lock The spinlock to lock.
*/
SpinLockGuard(const SPINLOCK& lock)
: m_lock(lock)
{
spinlock_acquire(&m_lock);
}
/**
* Creates the guard and locks the provided lock.
*
* @param lock The spinlock to lock.
*/
SpinLockGuard(const SpinLock& lock)
: m_lock(lock.m_lock)
{
spinlock_acquire(&m_lock);
}
/**
* Destroys the guard and unlocks the lock that was provided when
* the guard was created.
*/
~SpinLockGuard()
{
spinlock_release(&m_lock);
}
private:
SpinLockGuard(const SpinLockGuard&) /* = delete */;
SpinLockGuard& operator = (const SpinLockGuard&) /* = delete */;
const SPINLOCK& m_lock;
};
}