X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=core%2Fproducer%2Fstage.cpp;h=9fe30bbd45b917d03a901138cba211c987a16e9f;hb=a486c25d5e6ce0ebe08e9a2d793a447ff3cb797a;hp=6c7816ba91d345de3c42f583f86efb1fcf3e0759;hpb=8f091990c8e3c1997b4b2d89f97b319cb6ea889d;p=casparcg diff --git a/core/producer/stage.cpp b/core/producer/stage.cpp index 6c7816ba9..9fe30bbd4 100644 --- a/core/producer/stage.cpp +++ b/core/producer/stage.cpp @@ -30,6 +30,7 @@ #include #include +#include #include @@ -39,40 +40,6 @@ #include namespace caspar { namespace core { - -void destroy_producer(safe_ptr& producer) -{ - if(!producer.unique()) - CASPAR_LOG(debug) << producer->print() << L" Not destroyed on safe asynchronous destruction thread."; - - producer = frame_producer::empty(); -} - -class destroy_producer_proxy : public frame_producer -{ - safe_ptr producer_; - executor& destroy_context_; -public: - destroy_producer_proxy(executor& destroy_context, const safe_ptr& producer) - : producer_(producer) - , destroy_context_(destroy_context){} - - ~destroy_producer_proxy() - { - if(destroy_context_.size() > 4) - CASPAR_LOG(error) << L" Potential destroyer deadlock."; - - destroy_context_.begin_invoke(std::bind(&destroy_producer, std::move(producer_))); - } - - virtual safe_ptr receive(int hints) {return producer_->receive(hints);} - virtual safe_ptr last_frame() const {return producer_->last_frame();} - virtual std::wstring print() const {return producer_->print();} - virtual void param(const std::wstring& str) {producer_->param(str);} - virtual safe_ptr get_following_producer() const {return producer_->get_following_producer();} - virtual void set_leading_producer(const safe_ptr& producer) {producer_->set_leading_producer(producer);} - virtual int64_t nb_frames() const {return producer_->nb_frames();} -}; struct stage::implementation : boost::noncopyable { @@ -111,7 +78,7 @@ public: { channel_.execution().invoke([&] { - layers_[index].load(make_safe(channel_.destruction(), producer), preview, auto_play_delta); + layers_[index].load(create_destroy_producer_proxy(channel_.destruction(), producer), preview, auto_play_delta); }, high_priority); }