#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) { assert(_thread != nullptr); _valueHolder = new ThreadLocalObject::ValueHolder(); //ValueHolder *valueHolder = _valueHolder; _thread->Invoke(RTC_FROM_HERE, [this, generator](){ this->_valueHolder->_value.reset(generator()); }); } ~ThreadLocalObject() { ValueHolder *valueHolder = _valueHolder; _thread->Invoke(RTC_FROM_HERE, [this](){ this->_valueHolder->_value.reset(); }); delete valueHolder; } template void perform(FunctorT&& functor) { //ValueHolder *valueHolder = _valueHolder; /*_thread->PostTask(RTC_FROM_HERE, [valueHolder, f = std::forward>(f)](){ T *value = valueHolder->_value; assert(value != nullptr); f(*value); });*/ _thread->Invoke(RTC_FROM_HERE, [this, f = std::forward(functor)](){ assert(_valueHolder->_value != nullptr); f(_valueHolder->_value.get()); }); } template void performSync(FunctorT&& functor) { _thread->Invoke(RTC_FROM_HERE, [this, f = std::forward(functor)](){ assert(_valueHolder->_value != nullptr); f(_valueHolder->_value.get()); }); } private: rtc::Thread *_thread; ValueHolder *_valueHolder; }; #ifdef TGVOIP_NAMESPACE } #endif #endif