From aae2c28ef6830f2a70e8eecbebfcdfd6ab24d3ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6nke=20Ludwig?= Date: Fri, 27 Sep 2019 15:09:06 +0200 Subject: [PATCH] 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. --- source/vibe/core/core.d | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/source/vibe/core/core.d b/source/vibe/core/core.d index ee21629..66f3b01 100644 --- a/source/vibe/core/core.d +++ b/source/vibe/core/core.d @@ -1201,12 +1201,12 @@ private struct TimerCallbackHandler(CALLABLE) { auto yieldLock() @safe nothrow { static struct YieldLock { - @safe nothrow: + @safe nothrow: + private bool m_initialized; - private this(bool) { inc(); } - @disable this(); + private this(bool) { m_initialized = true; inc(); } @disable this(this); - ~this() { dec(); } + ~this() { if (m_initialized) dec(); } private void inc() { @@ -1215,6 +1215,7 @@ auto yieldLock() private void dec() { + assert(TaskFiber.getThis().m_yieldLockCount > 0); TaskFiber.getThis().m_yieldLockCount--; } } @@ -1235,6 +1236,12 @@ unittest { assert(tf.m_yieldLockCount == 1); } assert(tf.m_yieldLockCount == 0); + + { + typeof(yieldLock()) l; + assert(tf.m_yieldLockCount == 0); + } + assert(tf.m_yieldLockCount == 0); }