13#include "rapidjson/document.h"
14#include "rapidjson/stringbuffer.h"
15#include "rapidjson/writer.h"
18using rapidjson::Document;
19using rapidjson::StringBuffer;
20using rapidjson::Writer;
30static const char*
kCacheName =
"flutter_callback_cache.json";
31std::mutex DartCallbackCache::mutex_;
32std::string DartCallbackCache::cache_path_;
33std::map<int64_t, DartCallbackRepresentation> DartCallbackCache::cache_;
40 std::scoped_lock lock(mutex_);
41 auto iterator = cache_.find(handle);
42 if (iterator != cache_.end()) {
50 const std::string& class_name,
51 const std::string& library_path) {
52 std::scoped_lock lock(mutex_);
53 std::hash<std::string> hasher;
54 int64_t hash = hasher(
name);
55 hash += hasher(class_name);
56 hash += hasher(library_path);
58 if (cache_.find(hash) == cache_.end()) {
59 cache_[hash] = {
name, class_name, library_path};
65std::unique_ptr<DartCallbackRepresentation>
67 std::scoped_lock lock(mutex_);
68 auto iterator = cache_.find(handle);
69 if (iterator != cache_.end()) {
70 return std::make_unique<DartCallbackRepresentation>(iterator->second);
75void DartCallbackCache::SaveCacheToDisk() {
91 Writer<StringBuffer> writer(s);
93 for (
auto iterator = cache_.begin(); iterator != cache_.end(); ++iterator) {
94 int64_t hash = iterator->first;
100 writer.StartObject();
102 writer.String(cb.
name.c_str());
112 std::ofstream output(cache_path_);
113 output << s.GetString();
118 std::scoped_lock lock(mutex_);
121 if (!cache_.empty()) {
124 std::ifstream
input(cache_path_);
128 std::string cache_contents{std::istreambuf_iterator<char>(
input),
129 std::istreambuf_iterator<char>()};
131 d.Parse(cache_contents.c_str());
132 if (
d.HasParseError() || !
d.IsArray()) {
136 const auto entries =
d.GetArray();
137 for (
auto* it = entries.begin(); it != entries.end(); ++it) {
138 const auto root_obj = it->GetObject();
141 const int64_t hash = root_obj[
kHandleKey].GetInt64();
150Dart_Handle DartCallbackCache::LookupDartClosure(
151 const std::string&
name,
152 const std::string& class_name,
153 const std::string& library_path) {
154 Dart_Handle closure_name = ToDart(
name);
155 if (Dart_IsError(closure_name)) {
158 Dart_Handle library_name =
159 library_path.empty() ? Dart_Null() : ToDart(library_path);
160 if (Dart_IsError(library_name)) {
163 Dart_Handle cls_name = class_name.empty() ? Dart_Null() :
ToDart(class_name);
164 if (Dart_IsError(cls_name)) {
169 if (library_name == Dart_Null()) {
170 library = Dart_RootLibrary();
172 library = Dart_LookupLibrary(library_name);
174 if (Dart_IsError(library)) {
179 if (Dart_IsNull(cls_name)) {
180 closure = Dart_GetField(library, closure_name);
182 Dart_Handle cls = Dart_GetClass(library, cls_name);
183 if (Dart_IsError(cls)) {
186 if (Dart_IsNull(cls)) {
189 closure = Dart_GetStaticMethodClosure(library, cls, closure_name);
static std::unique_ptr< DartCallbackRepresentation > GetCallbackInformation(int64_t handle)
static int64_t GetCallbackHandle(const std::string &name, const std::string &class_name, const std::string &library_path)
static void LoadCacheFromDisk()
static Dart_Handle GetCallback(int64_t handle)
static void SetCachePath(const std::string &path)
static const char * kCacheName
static const char * kHandleKey
static const char * kLibraryPathKey
static const char * kClassNameKey
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir path
DEF_SWITCHES_START aot vmservice shared library name
static const char * kNameKey
static const char * kRepresentationKey
std::string JoinPaths(std::initializer_list< std::string > components)
std::function< void()> closure
Dart_Handle ToDart(const T &object)