Browse Source

准备使用doxygen来生成文档

tags/v2.9.7
tearshark 4 years ago
parent
commit
9db0f1a361
2 changed files with 2628 additions and 8 deletions
  1. 2576
    0
      Doxyfile
  2. 52
    8
      librf/src/mutex_v2.h

+ 2576
- 0
Doxyfile
File diff suppressed because it is too large
View File


+ 52
- 8
librf/src/mutex_v2.h View File

#pragma once #pragma once


#ifndef DOXYGEN_SKIP_PROPERTY
RESUMEF_NS RESUMEF_NS
{ {
namespace detail namespace detail


inline namespace mutex_v2 inline namespace mutex_v2
{ {
#endif
/**
* @brief 提示手工解锁,故相关的lock()函数不再返回scoped_unlock_t。
*/
struct adopt_manual_unlock_t{}; struct adopt_manual_unlock_t{};

/**
* @brief 提示手工解锁,故相关的lock()函数不再返回scoped_unlock_t。
*/
constexpr adopt_manual_unlock_t adopt_manual_unlock; constexpr adopt_manual_unlock_t adopt_manual_unlock;


/**
* @brief 在析构的时候自动解锁mutex_t的辅助类。
*/
template<class... _Mtxs> template<class... _Mtxs>
struct [[nodiscard]] scoped_unlock_t; struct [[nodiscard]] scoped_unlock_t;


//支持递归的锁
//锁被本协程所在的跟协程所拥有。支持在跟协程下的所有协程里递归加锁。
/**
* @brief 支持递归的锁。
* 锁被本协程所在的跟协程所拥有。支持在跟协程下的所有协程里递归加锁。
*/
struct mutex_t struct mutex_t
{ {
bool is_locked() const; bool is_locked() const;
/** /**
* @brief 在协程中加锁,如果不能立即获得锁,则阻塞当前协程。但不会阻塞当前线程。 * @brief 在协程中加锁,如果不能立即获得锁,则阻塞当前协程。但不会阻塞当前线程。
* 需要随后调用unlock()函数解锁。lock()/unlock()调用必须在同一个跟协程下配对调用。 * 需要随后调用unlock()函数解锁。lock()/unlock()调用必须在同一个跟协程下配对调用。
* @param manual_unlock_tag 提示手工解锁
* @return [co_await] void * @return [co_await] void
*/ */
manual_awaiter/*void*/ lock(adopt_manual_unlock_t) const noexcept;
manual_awaiter/*void*/ lock(adopt_manual_unlock_t manual_unlock_tag) const noexcept;




struct [[nodiscard]] try_awaiter; struct [[nodiscard]] try_awaiter;
bool try_lock_until(const std::chrono::time_point<_Rep, _Period>& tp, void* unique_address); bool try_lock_until(const std::chrono::time_point<_Rep, _Period>& tp, void* unique_address);


/** /**
* @brief 在非协程中解锁。立即返回。
* @brief 在非协程中解锁。立即返回。由于立即返回,也可在协程中如此使用:mtx.unlock(root_state())
* @param unique_address 代表获得锁的拥有者。 * @param unique_address 代表获得锁的拥有者。
*/ */
void unlock(void* unique_address) const; void unlock(void* unique_address) const;


/** /**
* @brief 在协程中,无死锁的批量加锁。不会阻塞当前线程。直到获得所有锁之前,会阻塞当前协程。 * @brief 在协程中,无死锁的批量加锁。不会阻塞当前线程。直到获得所有锁之前,会阻塞当前协程。
* @param mtxs... 需要获得的锁列表。
* @return [co_await] scoped_unlock_t * @return [co_await] scoped_unlock_t
*/ */
template<class... _Mtxs template<class... _Mtxs
#ifndef DOXYGEN_SKIP_PROPERTY
, typename = std::enable_if_t<std::conjunction_v<std::is_same<remove_cvref_t<_Mtxs>, mutex_t>...>> , typename = std::enable_if_t<std::conjunction_v<std::is_same<remove_cvref_t<_Mtxs>, mutex_t>...>>
#endif
> >
static future_t<scoped_unlock_t<_Mtxs...>> lock(_Mtxs&... mtxs); static future_t<scoped_unlock_t<_Mtxs...>> lock(_Mtxs&... mtxs);


/** /**
* @brief 在协程中,无死锁的批量加锁。不会阻塞当前线程。直到获得所有锁之前,会阻塞当前协程。 * @brief 在协程中,无死锁的批量加锁。不会阻塞当前线程。直到获得所有锁之前,会阻塞当前协程。
* @param manual_unlock_tag 提示手工解锁
* @param mtxs... 需要获得的锁列表。
* @return [co_await] void * @return [co_await] void
*/ */
template<class... _Mtxs template<class... _Mtxs
#ifndef DOXYGEN_SKIP_PROPERTY
, typename = std::enable_if_t<std::conjunction_v<std::is_same<remove_cvref_t<_Mtxs>, mutex_t>...>> , typename = std::enable_if_t<std::conjunction_v<std::is_same<remove_cvref_t<_Mtxs>, mutex_t>...>>
#endif
> >
static future_t<> lock(adopt_manual_unlock_t, _Mtxs&... mtxs);
static future_t<> lock(adopt_manual_unlock_t manual_unlock_tag, _Mtxs&... mtxs);


/** /**
* @brief 在协程中解锁。如果可能,使用unlock(root_state(), mtxs...)来替代。
* @brief 在协程中批量解锁。如果可能,使用unlock(root_state(), mtxs...)来替代。
* @param mtxs... 需要解锁的锁列表。
* @return [co_await] void * @return [co_await] void
*/ */
template<class... _Mtxs template<class... _Mtxs
#ifndef DOXYGEN_SKIP_PROPERTY
, typename = std::enable_if_t<std::conjunction_v<std::is_same<remove_cvref_t<_Mtxs>, mutex_t>...>> , typename = std::enable_if_t<std::conjunction_v<std::is_same<remove_cvref_t<_Mtxs>, mutex_t>...>>
#endif
> >
static future_t<> unlock(_Mtxs&... mtxs); static future_t<> unlock(_Mtxs&... mtxs);




/** /**
* @brief 在非协程中,无死锁的批量加锁。会阻塞当前线程,直到获得所有锁为止。 * @brief 在非协程中,无死锁的批量加锁。会阻塞当前线程,直到获得所有锁为止。
* @param unique_address 代表获得锁的拥有者。
* @param mtxs... 需要获得的锁列表。
* @return scoped_unlock_t * @return scoped_unlock_t
*/ */
template<class... _Mtxs template<class... _Mtxs
#ifndef DOXYGEN_SKIP_PROPERTY
, typename = std::enable_if_t<std::conjunction_v<std::is_same<remove_cvref_t<_Mtxs>, mutex_t>...>> , typename = std::enable_if_t<std::conjunction_v<std::is_same<remove_cvref_t<_Mtxs>, mutex_t>...>>
#endif
> >
static scoped_unlock_t<_Mtxs...> lock(void* unique_address, _Mtxs&... mtxs); static scoped_unlock_t<_Mtxs...> lock(void* unique_address, _Mtxs&... mtxs);


/** /**
* @brief 在非协程中,无死锁的批量加锁。会阻塞当前线程,直到获得所有锁为止。 * @brief 在非协程中,无死锁的批量加锁。会阻塞当前线程,直到获得所有锁为止。
* @param manual_unlock_tag 提示手工解锁
* @param unique_address 代表获得锁的拥有者。
* @param mtxs... 需要获得的锁列表。
*/ */
template<class... _Mtxs template<class... _Mtxs
#ifndef DOXYGEN_SKIP_PROPERTY
, typename = std::enable_if_t<std::conjunction_v<std::is_same<remove_cvref_t<_Mtxs>, mutex_t>...>> , typename = std::enable_if_t<std::conjunction_v<std::is_same<remove_cvref_t<_Mtxs>, mutex_t>...>>
#endif
> >
static void lock(adopt_manual_unlock_t, void* unique_address, _Mtxs&... mtxs);
static void lock(adopt_manual_unlock_t manual_unlock_tag, void* unique_address, _Mtxs&... mtxs);


/** /**
* @brief 在非协程中,批量解锁。立即返回。
* @brief 在非协程中批量解锁。立即返回。由于立即返回,也可在协程中如此使用:unlock(root_state(), mtxs...)
* @param unique_address 代表获得锁的拥有者。
* @param mtxs... 需要解锁的锁列表。
*/ */
template<class... _Mtxs template<class... _Mtxs
#ifndef DOXYGEN_SKIP_PROPERTY
, typename = std::enable_if_t<std::conjunction_v<std::is_same<remove_cvref_t<_Mtxs>, mutex_t>...>> , typename = std::enable_if_t<std::conjunction_v<std::is_same<remove_cvref_t<_Mtxs>, mutex_t>...>>
#endif
> >
static void unlock(void* unique_address, _Mtxs&... mtxs); static void unlock(void* unique_address, _Mtxs&... mtxs);


mutex_t(); mutex_t();

/**
* @brief 构造一个无效的mutex_t。
*/
mutex_t(std::adopt_lock_t) noexcept; mutex_t(std::adopt_lock_t) noexcept;
~mutex_t() noexcept; ~mutex_t() noexcept;


mutex_t& operator = (const mutex_t&) = default; mutex_t& operator = (const mutex_t&) = default;
mutex_t& operator = (mutex_t&&) = default; mutex_t& operator = (mutex_t&&) = default;


#ifndef DOXYGEN_SKIP_PROPERTY
typedef std::shared_ptr<detail::mutex_v2_impl> mutex_impl_ptr; typedef std::shared_ptr<detail::mutex_v2_impl> mutex_impl_ptr;
typedef std::chrono::system_clock clock_type; typedef std::chrono::system_clock clock_type;
private: private:
template<class... _Mtxs> friend struct scoped_unlock_t; template<class... _Mtxs> friend struct scoped_unlock_t;


mutex_impl_ptr _mutex; mutex_impl_ptr _mutex;
#endif
}; };
} }
} }

Loading…
Cancel
Save