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