1
0
mirror of https://github.com/Zygo/bees.git synced 2025-05-18 05:45:45 +02:00

bytevector: do not deadlock in self-assignment

Not that this is a particularly useful use case, but it will lock up,
and it should not.

Signed-off-by: Zygo Blaxell <bees@furryterror.org>
This commit is contained in:
Zygo Blaxell 2022-11-19 18:23:33 -05:00
parent b699325a77
commit 148cc03060

View File

@ -60,11 +60,15 @@ namespace crucible {
ByteVector& ByteVector&
ByteVector::operator=(const ByteVector &that) ByteVector::operator=(const ByteVector &that)
{ {
// If &that == this, there's no need to do anything, but
// especially don't try to lock the same mutex twice.
if (&m_mutex != &that.m_mutex) {
unique_lock<mutex> lock_this(m_mutex, defer_lock); unique_lock<mutex> lock_this(m_mutex, defer_lock);
unique_lock<mutex> lock_that(that.m_mutex, defer_lock); unique_lock<mutex> lock_that(that.m_mutex, defer_lock);
lock(lock_this, lock_that); lock(lock_this, lock_that);
m_ptr = that.m_ptr; m_ptr = that.m_ptr;
m_size = that.m_size; m_size = that.m_size;
}
return *this; return *this;
} }