mirror of
https://github.com/Zygo/bees.git
synced 2025-06-15 17:26:15 +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:
@ -60,11 +60,15 @@ namespace crucible {
|
||||
ByteVector&
|
||||
ByteVector::operator=(const ByteVector &that)
|
||||
{
|
||||
unique_lock<mutex> lock_this(m_mutex, defer_lock);
|
||||
unique_lock<mutex> lock_that(that.m_mutex, defer_lock);
|
||||
lock(lock_this, lock_that);
|
||||
m_ptr = that.m_ptr;
|
||||
m_size = that.m_size;
|
||||
// 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_that(that.m_mutex, defer_lock);
|
||||
lock(lock_this, lock_that);
|
||||
m_ptr = that.m_ptr;
|
||||
m_size = that.m_size;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user