#ifndef TGVOIP_WEBRTC_THREAD_LOCAL_OBJECT_H #define TGVOIP_WEBRTC_THREAD_LOCAL_OBJECT_H #include "rtc_base/thread.h" #include #include #ifdef TGVOIP_NAMESPACE namespace TGVOIP_NAMESPACE { #endif template class ThreadLocalObject { private: template class ValueHolder { public: std::shared_ptr _value; }; public: ThreadLocalObject(rtc::Thread *thread, std::function generator) : _thread(thread), _valueHolder(new ThreadLocalObject::ValueHolder()) { assert(_thread != nullptr); _thread->PostTask(RTC_FROM_HERE, [valueHolder = _valueHolder, generator](){ valueHolder->_value.reset(generator()); }); } ~ThreadLocalObject() { _thread->PostTask(RTC_FROM_HERE, [valueHolder = _valueHolder](){ valueHolder->_value.reset(); }); } template void perform(FunctorT&& functor) { _thread->PostTask(RTC_FROM_HERE, [valueHolder = _valueHolder, f = std::forward(functor)](){ assert(valueHolder->_value != nullptr); f(valueHolder->_value.get()); }); } private: rtc::Thread *_thread; std::shared_ptr> _valueHolder; }; #ifdef TGVOIP_NAMESPACE } #endif #endif