3 #include "executor.h"
\r
5 #include "../log/log.h"
\r
8 #define WIN32_LEAN_AND_MEAN
\r
10 #include <Windows.h>
\r
12 #include <boost/noncopyable.hpp>
\r
13 #include <boost/thread/future.hpp>
\r
15 #include <functional>
\r
19 template<typename T>
\r
20 class com_context : public executor
\r
22 std::unique_ptr<T> instance_;
\r
24 com_context(const std::wstring& name) : executor(name)
\r
26 executor::begin_invoke([]
\r
28 ::CoInitialize(nullptr);
\r
34 if(!executor::begin_invoke([&]
\r
36 instance_.reset(nullptr);
\r
38 }).timed_wait(boost::posix_time::milliseconds(500)))
\r
40 CASPAR_LOG(error) << L"[com_contex] Timer expired, deadlock detected and released, leaking resources";
\r
44 void reset(const std::function<T*()>& factory = nullptr)
\r
46 executor::invoke([&]
\r
50 instance_.reset(factory());
\r
54 T& operator*() const { return *instance_.get();} // noexcept
\r
56 T* operator->() const { return instance_.get();} // noexcept
\r
58 T* get() const { return instance_.get();} // noexcept
\r
60 operator bool() const {return get() != nullptr;}
\r