From bac9874388b36572f9872096e2cc53c2e360123b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaakko=20Ker=C3=A4nen?= Date: Tue, 11 Jun 2019 21:29:10 +0300 Subject: [PATCH] libcore: Improved Observers for multithreading --- doomsday/libs/core/include/de/data/observers.h | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/doomsday/libs/core/include/de/data/observers.h b/doomsday/libs/core/include/de/data/observers.h index 1d6fa714c2..2f129060bf 100644 --- a/doomsday/libs/core/include/de/data/observers.h +++ b/doomsday/libs/core/include/de/data/observers.h @@ -378,14 +378,11 @@ class Observers : public Lockable, public IAudience virtual ~Observers() { _disassociateAllMembers(); - DE_GUARD(this); } void clear() { - DE_GUARD(this); _disassociateAllMembers(); - _members.clear(); } Observers &operator=(Observers const &other) @@ -522,8 +519,14 @@ class Observers : public Lockable, public IAudience private: void _disassociateAllMembers() { - for (Type *observer : _members) + for (;;) { + Type *observer; + { + DE_GUARD(this); + if (_members.isEmpty()) break; + observer = _members.take(); + } observer->removeMemberOf(*this); } }