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