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