1 #include "JSIStoreValueUser.h"
2 #include "RuntimeManager.h"
3 #ifdef ANDROID
4 #include <AndroidScheduler.h>
5 #endif
6 
7 namespace reanimated {
8 
9 std::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 
22 StoreUser::StoreUser(
23     std::shared_ptr<Scheduler> s,
24     const RuntimeManager &runtimeManager)
25     : scheduler(s) {
26   storeUserData = runtimeManager.storeUserData;
27   identifier = storeUserData->ctr++;
28 }
29 
30 StoreUser::~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