Make sure that an uninitialized YieldLock does not decrement the lock counter.

Uninitialized YieldLock values can happen in various ways, dispite the default constructor being disabled. If any such value got destroyed, it would lead to a negative lock count. Since this is handled properly now, the default constructor is also enabled in this commit.
This commit is contained in:
Sönke Ludwig 2019-09-27 15:09:06 +02:00
parent 24a83434e4
commit aae2c28ef6

View file

@ -1202,11 +1202,11 @@ auto yieldLock()
@safe nothrow { @safe nothrow {
static struct YieldLock { static struct YieldLock {
@safe nothrow: @safe nothrow:
private bool m_initialized;
private this(bool) { inc(); } private this(bool) { m_initialized = true; inc(); }
@disable this();
@disable this(this); @disable this(this);
~this() { dec(); } ~this() { if (m_initialized) dec(); }
private void inc() private void inc()
{ {
@ -1215,6 +1215,7 @@ auto yieldLock()
private void dec() private void dec()
{ {
assert(TaskFiber.getThis().m_yieldLockCount > 0);
TaskFiber.getThis().m_yieldLockCount--; TaskFiber.getThis().m_yieldLockCount--;
} }
} }
@ -1235,6 +1236,12 @@ unittest {
assert(tf.m_yieldLockCount == 1); assert(tf.m_yieldLockCount == 1);
} }
assert(tf.m_yieldLockCount == 0); assert(tf.m_yieldLockCount == 0);
{
typeof(yieldLock()) l;
assert(tf.m_yieldLockCount == 0);
}
assert(tf.m_yieldLockCount == 0);
} }