1*ab11e3c9SKudo Chien #include "JSIStoreValueUser.h" 2*ab11e3c9SKudo Chien #include "RuntimeManager.h" 3*ab11e3c9SKudo Chien #ifdef ANDROID 4*ab11e3c9SKudo Chien #include <AndroidScheduler.h> 5*ab11e3c9SKudo Chien #endif 6*ab11e3c9SKudo Chien 7*ab11e3c9SKudo Chien namespace reanimated { 8*ab11e3c9SKudo Chien getWeakRef(jsi::Runtime & rt)9*ab11e3c9SKudo Chienstd::weak_ptr<jsi::Value> StoreUser::getWeakRef(jsi::Runtime &rt) { 10*ab11e3c9SKudo Chien const std::lock_guard<std::recursive_mutex> lock(storeUserData->storeMutex); 11*ab11e3c9SKudo Chien if (storeUserData->store.count(identifier) == 0) { 12*ab11e3c9SKudo Chien storeUserData->store[identifier] = 13*ab11e3c9SKudo Chien std::vector<std::shared_ptr<jsi::Value>>(); 14*ab11e3c9SKudo Chien } 15*ab11e3c9SKudo Chien std::shared_ptr<jsi::Value> sv = 16*ab11e3c9SKudo Chien std::make_shared<jsi::Value>(rt, jsi::Value::undefined()); 17*ab11e3c9SKudo Chien storeUserData->store[identifier].push_back(sv); 18*ab11e3c9SKudo Chien 19*ab11e3c9SKudo Chien return sv; 20*ab11e3c9SKudo Chien } 21*ab11e3c9SKudo Chien StoreUser(std::shared_ptr<Scheduler> s,const RuntimeManager & runtimeManager)22*ab11e3c9SKudo ChienStoreUser::StoreUser( 23*ab11e3c9SKudo Chien std::shared_ptr<Scheduler> s, 24*ab11e3c9SKudo Chien const RuntimeManager &runtimeManager) 25*ab11e3c9SKudo Chien : scheduler(s) { 26*ab11e3c9SKudo Chien storeUserData = runtimeManager.storeUserData; 27*ab11e3c9SKudo Chien identifier = storeUserData->ctr++; 28*ab11e3c9SKudo Chien } 29*ab11e3c9SKudo Chien ~StoreUser()30*ab11e3c9SKudo ChienStoreUser::~StoreUser() { 31*ab11e3c9SKudo Chien int id = identifier; 32*ab11e3c9SKudo Chien std::shared_ptr<Scheduler> strongScheduler = scheduler.lock(); 33*ab11e3c9SKudo Chien if (strongScheduler != nullptr) { 34*ab11e3c9SKudo Chien std::shared_ptr<StaticStoreUser> sud = storeUserData; 35*ab11e3c9SKudo Chien #ifdef ANDROID 36*ab11e3c9SKudo Chien jni::ThreadScope::WithClassLoader([&] { 37*ab11e3c9SKudo Chien strongScheduler->scheduleOnUI([id, sud]() { 38*ab11e3c9SKudo Chien const std::lock_guard<std::recursive_mutex> lock(sud->storeMutex); 39*ab11e3c9SKudo Chien if (sud->store.count(id) > 0) { 40*ab11e3c9SKudo Chien sud->store.erase(id); 41*ab11e3c9SKudo Chien } 42*ab11e3c9SKudo Chien }); 43*ab11e3c9SKudo Chien }); 44*ab11e3c9SKudo Chien #else 45*ab11e3c9SKudo Chien strongScheduler->scheduleOnUI([id, sud]() { 46*ab11e3c9SKudo Chien const std::lock_guard<std::recursive_mutex> lock(sud->storeMutex); 47*ab11e3c9SKudo Chien if (sud->store.count(id) > 0) { 48*ab11e3c9SKudo Chien sud->store.erase(id); 49*ab11e3c9SKudo Chien } 50*ab11e3c9SKudo Chien }); 51*ab11e3c9SKudo Chien #endif 52*ab11e3c9SKudo Chien } 53*ab11e3c9SKudo Chien } 54*ab11e3c9SKudo Chien 55*ab11e3c9SKudo Chien } // namespace reanimated 56