diff --git a/src/common/visitordispatcher.hpp b/src/common/visitordispatcher.hpp index e81a573d4..50d726761 100644 --- a/src/common/visitordispatcher.hpp +++ b/src/common/visitordispatcher.hpp @@ -28,6 +28,7 @@ #include "common/error.hpp" #include "common/util.hpp" #include "common/singleton.hpp" +#include "common/multithread.hpp" #include @@ -57,6 +58,15 @@ namespace cinelerra size_t tagID; ///< tag value static size_t lastRegisteredID; + private: + static void + generateID (size_t& id) + { + Thread::Lock guard SIDEEFFECT; + if (!id) + id = ++lastRegisteredID; + } + public: Tag() : tagID(0) { } operator size_t() const { return tagID; } @@ -66,10 +76,8 @@ namespace cinelerra static Tag& get (TOOLImpl* const concreteTool=0) { - TODO ("race condition"); Tag& t = TagTypeRegistry::tag; - if (!t) - t.tagID = ++lastRegisteredID; + if (!t) generateID (t.tagID); return t; } @@ -127,6 +135,14 @@ namespace cinelerra std::vector table_; + void + accomodate (size_t index) + { + Thread::Lock guard SIDEEFFECT; + if (index > table_.size()) + table_.resize (index); // performance bottleneck?? TODO: measure the real impact! + } + inline bool is_known (size_t id) { @@ -136,9 +152,10 @@ namespace cinelerra inline void storePtr (size_t id, Trampoline func) { - TODO ("error- and concurrency handling"); + REQUIRE (func); + REQUIRE (0 < id); if (id>table_.size()) - table_.resize (id); // performance bottleneck?? TODO: measure the real impact! + accomodate (id); table_[id-1] = func; } diff --git a/src/proc/assetmanager.cpp b/src/proc/assetmanager.cpp index 90ddaca35..46717c166 100644 --- a/src/proc/assetmanager.cpp +++ b/src/proc/assetmanager.cpp @@ -27,7 +27,6 @@ #include "common/multithread.hpp" #include "common/util.hpp" -//#include #include #include @@ -37,7 +36,6 @@ using std::tr1::static_pointer_cast; using boost::function; using boost::format; using boost::bind; -//using boost::lambda::_1; using util::for_each; using cinelerra::Singleton;