#include "separated/separated_producer.h"\r
\r
#include <common/memory/safe_ptr.h>\r
-#include <common/concurrency/executor.h>\r
#include <common/exception/exceptions.h>\r
-#include <common/utility/move_on_copy.h>\r
\r
#include <concrt_extras.h>\r
+#include <concurrent_vector.h>\r
\r
namespace caspar { namespace core {\r
\r
-std::vector<const producer_factory_t> g_factories;\r
- \r
struct destruction_context\r
{\r
std::shared_ptr<frame_producer> producer;\r
Concurrency::event event;\r
\r
- destruction_context(std::shared_ptr<frame_producer>&& producer) : producer(producer){}\r
+ destruction_context(std::shared_ptr<frame_producer>&& producer) \r
+ : producer(producer)\r
+ {\r
+ }\r
};\r
\r
void __cdecl destroy_producer(LPVOID lpParam)\r
std::shared_ptr<frame_producer> producer_;\r
public:\r
destroy_producer_proxy(const std::shared_ptr<frame_producer>& producer) \r
- : producer_(producer){}\r
+ : producer_(producer)\r
+ {\r
+ }\r
\r
~destroy_producer_proxy()\r
{ \r
virtual int64_t nb_frames() const {return producer_->nb_frames();}\r
};\r
\r
-safe_ptr<core::frame_producer> create_destroy_producer_proxy(const safe_ptr<frame_producer>& producer)\r
-{\r
- return make_safe<destroy_producer_proxy>(producer);\r
-}\r
-\r
class last_frame_producer : public frame_producer\r
{\r
const std::wstring print_;\r
}\r
return frame;\r
}\r
+ \r
+Concurrency::concurrent_vector<std::shared_ptr<producer_factory_t>> g_factories;\r
\r
void register_producer_factory(const producer_factory_t& factory)\r
{\r
- g_factories.push_back(factory);\r
+ g_factories.push_back(std::make_shared<producer_factory_t>(factory));\r
}\r
\r
safe_ptr<core::frame_producer> do_create_producer(const safe_ptr<frame_factory>& my_frame_factory, const std::vector<std::wstring>& params)\r
BOOST_THROW_EXCEPTION(invalid_argument() << arg_name_info("params") << arg_value_info(""));\r
\r
auto producer = frame_producer::empty();\r
- std::any_of(g_factories.begin(), g_factories.end(), [&](const producer_factory_t& factory) -> bool\r
+ std::any_of(g_factories.begin(), g_factories.end(), [&](const std::shared_ptr<producer_factory_t>& factory) -> bool\r
{\r
try\r
{\r
- producer = factory(my_frame_factory, params);\r
+ producer = (*factory)(my_frame_factory, params);\r
}\r
catch(...)\r
{\r
if(producer == frame_producer::empty())\r
producer = create_color_producer(my_frame_factory, params);\r
\r
- return producer;\r
+ return make_safe<destroy_producer_proxy>(producer);\r
}\r
\r
-\r
safe_ptr<core::frame_producer> create_producer(const safe_ptr<frame_factory>& my_frame_factory, const std::vector<std::wstring>& params)\r
{ \r
auto producer = do_create_producer(my_frame_factory, params);\r