From 71279b24ddba72562faab3304ba0797412467098 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Thu, 4 Dec 2008 03:28:19 +0000 Subject: [PATCH] Adjust the thread counting to use atomic adds. This should prevent the previous scenario where many more threads than the limit could actually be spawned. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28775 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../registrar/mime/RegistrarThreadManager.cpp | 13 ++++++++----- src/servers/registrar/mime/RegistrarThreadManager.h | 4 ++-- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/servers/registrar/mime/RegistrarThreadManager.cpp b/src/servers/registrar/mime/RegistrarThreadManager.cpp index 187aaac0f5..a8cff5a201 100644 --- a/src/servers/registrar/mime/RegistrarThreadManager.cpp +++ b/src/servers/registrar/mime/RegistrarThreadManager.cpp @@ -87,19 +87,22 @@ status_t RegistrarThreadManager::LaunchThread(RegistrarThread *thread) { status_t err = thread ? B_OK : B_BAD_VALUE; - if (!err) - err = fThreadCount < kThreadLimit ? (status_t)B_OK : (status_t)B_NO_MORE_THREADS; + if (!err) { + if (atomic_add(&fThreadCount, 1) >= kThreadLimit) { + err = B_NO_MORE_THREADS; + atomic_add(&fThreadCount, -1); + } + } if (!err) { fThreads.push_back(thread); - fThreadCount++; err = thread->Run(); if (err) { std::list::iterator i; for (i = fThreads.begin(); i != fThreads.end();) { if ((*i) == thread) { i = fThreads.erase(i); - fThreadCount--; + atomic_add(&fThreadCount, -1); break; } else ++i; @@ -234,7 +237,7 @@ std::list::iterator& RegistrarThreadManager::RemoveThread(std::list::iterator &i) { delete *i; - fThreadCount--; + atomic_add(&fThreadCount, -1); return (i = fThreads.erase(i)); } diff --git a/src/servers/registrar/mime/RegistrarThreadManager.h b/src/servers/registrar/mime/RegistrarThreadManager.h index 12382a77e5..e111bcde54 100644 --- a/src/servers/registrar/mime/RegistrarThreadManager.h +++ b/src/servers/registrar/mime/RegistrarThreadManager.h @@ -33,13 +33,13 @@ public: uint ThreadCount() const; - static const uint kThreadLimit = 12; + static const int kThreadLimit = 12; private: std::list::iterator& RemoveThread(std::list::iterator &i); std::list fThreads; - uint fThreadCount; + vint32 fThreadCount; }; #endif // THREAD_MANAGER_H