#include "JSIStoreValueUser.h" #include "RuntimeManager.h" #ifdef ANDROID #include #endif namespace reanimated { std::weak_ptr StoreUser::getWeakRef(jsi::Runtime &rt) { const std::lock_guard lock(storeUserData->storeMutex); if (storeUserData->store.count(identifier) == 0) { storeUserData->store[identifier] = std::vector>(); } std::shared_ptr sv = std::make_shared(rt, jsi::Value::undefined()); storeUserData->store[identifier].push_back(sv); return sv; } StoreUser::StoreUser( std::shared_ptr s, const RuntimeManager &runtimeManager) : scheduler(s) { storeUserData = runtimeManager.storeUserData; identifier = storeUserData->ctr++; } StoreUser::~StoreUser() { int id = identifier; std::shared_ptr strongScheduler = scheduler.lock(); if (strongScheduler != nullptr) { std::shared_ptr sud = storeUserData; #ifdef ANDROID jni::ThreadScope::WithClassLoader([&] { strongScheduler->scheduleOnUI([id, sud]() { const std::lock_guard lock(sud->storeMutex); if (sud->store.count(id) > 0) { sud->store.erase(id); } }); }); #else strongScheduler->scheduleOnUI([id, sud]() { const std::lock_guard lock(sud->storeMutex); if (sud->store.count(id) > 0) { sud->store.erase(id); } }); #endif } } } // namespace reanimated