diff --git a/src/common/async/shared_mutex.h b/src/common/async/shared_mutex.h deleted file mode 100644 index f71928fd833..00000000000 --- a/src/common/async/shared_mutex.h +++ /dev/null @@ -1,428 +0,0 @@ -// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- -// vim: ts=8 sw=2 smarttab -/* - * Ceph - scalable distributed file system - * - * Copyright (C) 2018 Red Hat - * - * This is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License version 2.1, as published by the Free Software - * Foundation. See file COPYING. - * - */ - -#ifndef CEPH_ASYNC_SHARED_MUTEX_H -#define CEPH_ASYNC_SHARED_MUTEX_H - -#include -#include -#include // for std::shared_lock - -#include - -#include "common/async/completion.h" - -namespace ceph::async { - -/** - * An asynchronous shared mutex for use with boost::asio. - * - * A shared mutex class with asynchronous lock operations that complete on a - * boost::asio executor. The class also has synchronous interfaces that meet - * most of the standard library's requirements for the SharedMutex concept, - * which makes it compatible with lock_guard, unique_lock, and shared_lock. - * - * All lock requests can fail with operation_aborted on cancel() or destruction. - * The non-error_code overloads of lock() and lock_shared() will throw this - * error as an exception of type boost::system::system_error. - * - * Exclusive locks are prioritized over shared locks. Locks of the same type - * are granted in fifo order. The implementation defines a limit on the number - * of shared locks to 65534 at a time. - * - * Example use: - * - * boost::asio::io_context context; - * SharedMutex mutex{context.get_executor()}; - * - * mutex.async_lock([&] (boost::system::error_code ec, auto lock) { - * if (!ec) { - * // mutate shared state ... - * } - * }); - * mutex.async_lock_shared([&] (boost::system::error_code ec, auto lock) { - * if (!ec) { - * // read shared state ... - * } - * }); - * - * context.run(); - */ -template -class SharedMutex { - public: - SharedMutex(const Executor& ex1); - - /// on destruction, all pending lock requests are canceled - ~SharedMutex(); - - using executor_type = Executor; - executor_type get_executor() const noexcept { return ex1; } - - /// initiate an asynchronous request for an exclusive lock. when the lock is - /// granted, the completion handler is invoked with a successful error code - /// and a std::unique_lock that owns this mutex. - /// Signature = void(boost::system::error_code, std::unique_lock) - template - auto async_lock(CompletionToken&& token); - - /// wait synchronously for an exclusive lock. if an error occurs before the - /// lock is granted, that error is thrown as an exception - void lock(); - - /// wait synchronously for an exclusive lock. if an error occurs before the - /// lock is granted, that error is assigned to 'ec' - void lock(boost::system::error_code& ec); - - /// try to acquire an exclusive lock. if the lock is not immediately - /// available, returns false - bool try_lock(); - - /// releases an exclusive lock. not required to be called from the same thread - /// that initiated the lock - void unlock(); - - /// initiate an asynchronous request for a shared lock. when the lock is - /// granted, the completion handler is invoked with a successful error code - /// and a std::shared_lock that owns this mutex. - /// Signature = void(boost::system::error_code, std::shared_lock) - template - auto async_lock_shared(CompletionToken&& token); - - /// wait synchronously for a shared lock. if an error occurs before the - /// lock is granted, that error is thrown as an exception - void lock_shared(); - - /// wait synchronously for a shared lock. if an error occurs before the lock - /// is granted, that error is assigned to 'ec' - void lock_shared(boost::system::error_code& ec); - - /// try to acquire a shared lock. if the lock is not immediately available, - /// returns false - bool try_lock_shared(); - - /// releases a shared lock. not required to be called from the same thread - /// that initiated the lock - void unlock_shared(); - - /// cancel any pending requests for exclusive or shared locks with an - /// operation_aborted error - void cancel(); - - private: - Executor ex1; //< default callback executor - - struct LockRequest : public boost::intrusive::list_base_hook<> { - virtual ~LockRequest() {} - virtual void complete(boost::system::error_code ec) = 0; - virtual void destroy() = 0; - }; - using RequestList = boost::intrusive::list; - - RequestList shared_queue; //< requests waiting on a shared lock - RequestList exclusive_queue; //< requests waiting on an exclusive lock - - /// lock state encodes the number of shared lockers, or 'max' for exclusive - using LockState = uint16_t; - static constexpr LockState Unlocked = 0; - static constexpr LockState Exclusive = std::numeric_limits::max(); - static constexpr LockState MaxShared = Exclusive - 1; - LockState state = Unlocked; //< current lock state - - std::mutex mutex; //< protects lock state and wait queues - - // sync requests live on the stack and wait on a condition variable - class SyncRequest; - - // async requests use async::Completion to invoke a handler on its executor - template