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