diff --git a/tdutils/CMakeLists.txt b/tdutils/CMakeLists.txt index 6603c6846..c56438cb3 100644 --- a/tdutils/CMakeLists.txt +++ b/tdutils/CMakeLists.txt @@ -138,6 +138,7 @@ set(TDUTILS_SOURCE td/utils/port/IPAddress.h td/utils/port/IoSlice.h td/utils/port/MemoryMapping.h + td/utils/port/Mutex.h td/utils/port/path.h td/utils/port/platform.h td/utils/port/Poll.h diff --git a/tdutils/td/utils/MpscPollableQueue.h b/tdutils/td/utils/MpscPollableQueue.h index e4c7ba2b2..4daf4a0b9 100644 --- a/tdutils/td/utils/MpscPollableQueue.h +++ b/tdutils/td/utils/MpscPollableQueue.h @@ -12,7 +12,7 @@ #if !TD_EVENTFD_UNSUPPORTED -#include "td/utils/SpinLock.h" +#include "td/utils/port/Mutex.h" #include @@ -91,7 +91,7 @@ class MpscPollableQueue { } private: - SpinLock lock_; + Mutex lock_; bool wait_event_fd_{false}; EventFd event_fd_; std::vector writer_vector_; diff --git a/tdutils/td/utils/port/Mutex.h b/tdutils/td/utils/port/Mutex.h new file mode 100644 index 000000000..44710dd1d --- /dev/null +++ b/tdutils/td/utils/port/Mutex.h @@ -0,0 +1,20 @@ +#include + +namespace td { +class Mutex { + public: + struct Guard { + std::unique_lock guard; + void reset() { + guard.unlock(); + } + }; + + Guard lock() { + return {std::unique_lock(mutex_)}; + } + + private: + std::mutex mutex_; +}; +} // namespace td diff --git a/tdutils/td/utils/port/ServerSocketFd.cpp b/tdutils/td/utils/port/ServerSocketFd.cpp index 6e4158c1c..139252b40 100644 --- a/tdutils/td/utils/port/ServerSocketFd.cpp +++ b/tdutils/td/utils/port/ServerSocketFd.cpp @@ -29,7 +29,7 @@ #if TD_PORT_WINDOWS #include "td/utils/port/detail/Iocp.h" -#include "td/utils/SpinLock.h" +#include "td/utils/port/Mutex.h" #include "td/utils/VectorQueue.h" #endif @@ -87,7 +87,7 @@ class ServerSocketFdImpl final : private Iocp::Callback { private: PollableFdInfo info_; - SpinLock lock_; + Mutex lock_; VectorQueue accepted_; VectorQueue pending_errors_; static constexpr size_t MAX_ADDR_SIZE = sizeof(sockaddr_in6) + 16; diff --git a/tdutils/td/utils/port/SocketFd.cpp b/tdutils/td/utils/port/SocketFd.cpp index 9076c4e4a..90d516db3 100644 --- a/tdutils/td/utils/port/SocketFd.cpp +++ b/tdutils/td/utils/port/SocketFd.cpp @@ -17,7 +17,7 @@ #if TD_PORT_WINDOWS #include "td/utils/buffer.h" #include "td/utils/port/detail/Iocp.h" -#include "td/utils/SpinLock.h" +#include "td/utils/port/Mutex.h" #include "td/utils/VectorQueue.h" #include @@ -164,7 +164,7 @@ class SocketFdImpl final : private Iocp::Callback { private: PollableFdInfo info_; - SpinLock lock_; + Mutex lock_; std::atomic refcnt_{1}; bool close_flag_{false}; diff --git a/tdutils/td/utils/port/UdpSocketFd.cpp b/tdutils/td/utils/port/UdpSocketFd.cpp index d33d24340..eee487d44 100644 --- a/tdutils/td/utils/port/UdpSocketFd.cpp +++ b/tdutils/td/utils/port/UdpSocketFd.cpp @@ -18,7 +18,7 @@ #if TD_PORT_WINDOWS #include "td/utils/port/detail/Iocp.h" -#include "td/utils/SpinLock.h" +#include "td/utils/port/Mutex.h" #endif #if TD_PORT_POSIX @@ -154,7 +154,7 @@ class UdpSocketFdImpl final : private Iocp::Callback { private: PollableFdInfo info_; - SpinLock lock_; + Mutex lock_; std::atomic refcnt_{1}; bool is_connected_{false}; diff --git a/tdutils/td/utils/port/detail/PollableFd.h b/tdutils/td/utils/port/detail/PollableFd.h index ba8c8891b..01fb5857e 100644 --- a/tdutils/td/utils/port/detail/PollableFd.h +++ b/tdutils/td/utils/port/detail/PollableFd.h @@ -12,8 +12,8 @@ #include "td/utils/logging.h" #include "td/utils/Observer.h" #include "td/utils/port/detail/NativeFd.h" +#include "td/utils/port/Mutex.h" #include "td/utils/port/PollFlags.h" -#include "td/utils/SpinLock.h" #include #include @@ -140,7 +140,7 @@ class PollableFdInfo final : private ListNode { std::atomic_flag lock_ = ATOMIC_FLAG_INIT; PollFlagsSet flags_; #if TD_PORT_WINDOWS - SpinLock observer_lock_; + Mutex observer_lock_; #endif ObserverBase *observer_{nullptr}; diff --git a/tdutils/test/ConcurrentHashMap.cpp b/tdutils/test/ConcurrentHashMap.cpp index 3e2219f1a..de8ef9a71 100644 --- a/tdutils/test/ConcurrentHashMap.cpp +++ b/tdutils/test/ConcurrentHashMap.cpp @@ -7,6 +7,7 @@ #include "td/utils/benchmark.h" #include "td/utils/ConcurrentHashTable.h" #include "td/utils/misc.h" +#include "td/utils/port/Mutex.h" #include "td/utils/port/thread.h" #include "td/utils/SpinLock.h" #include "td/utils/tests.h" @@ -72,11 +73,11 @@ class ConcurrentHashMapMutex { return "ConcurrentHashMapMutex"; } void insert(KeyT key, ValueT value) { - std::unique_lock lock(mutex_); + auto guard = mutex_.lock(); hash_map_.emplace(key, value); } ValueT find(KeyT key, ValueT default_value) { - std::unique_lock lock(mutex_); + auto guard = mutex_.lock(); auto it = hash_map_.find(key); if (it == hash_map_.end()) { return default_value; @@ -85,7 +86,7 @@ class ConcurrentHashMapMutex { } private: - std::mutex mutex_; + Mutex mutex_; #if TD_HAVE_ABSL absl::flat_hash_map hash_map_; #else