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 Chien std::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 Chien StoreUser::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 Chien StoreUser::~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