From: LoRd_MuldeR Date: Sun, 15 Apr 2018 00:20:09 +0000 (+0200) Subject: Some improvements to Lazy class. X-Git-Tag: v1.10~4 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=5673c6f14a1712055ceddbf4614a1c8274354acb;p=mutilities%2FMUtilities.git Some improvements to Lazy class. --- diff --git a/include/MUtils/Lazy.h b/include/MUtils/Lazy.h index e5fb12d..904c1ec 100644 --- a/include/MUtils/Lazy.h +++ b/include/MUtils/Lazy.h @@ -52,20 +52,26 @@ namespace MUtils T& operator*(void) { - while (!m_value) + T *value; + do { - if (T *const value = m_initializer()) + if (!(value = m_value.fetchAndAddOrdered(0))) { - if (!m_value.testAndSetOrdered(NULL, value)) + if (value = m_initializer()) { - delete value; /*too late*/ + if (!m_value.testAndSetOrdered(NULL, value)) + { + delete value; + value = NULL; + } + } + else + { + MUTILS_THROW("Initializer returned NULL pointer!"); } - } - else - { - MUTILS_THROW("Initializer returned NULL!"); } } + while (!value); return *m_value; }