/* * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef SRC_TRACE_PROCESSOR_SQLITE_MODULE_LIFECYCLE_MANAGER_H_ #define SRC_TRACE_PROCESSOR_SQLITE_MODULE_LIFECYCLE_MANAGER_H_ #include <memory> #include <string> #include <string_view> #include "perfetto/base/logging.h" #include "perfetto/ext/base/flat_hash_map.h" namespace perfetto::trace_processor::sqlite { // Helper class which abstracts away management of per-vtab state of an SQLite // virtual table module. // // SQLite has some subtle semantics around lifecycle of vtabs which makes state // management complex. This class attempts to encapsulate some of that // complexity as a central place where we can document the quirks. // // Usage of this class: // struct MyModule : sqlite::Module<MyModule> { // struct Context { // // Store the manager in the context object. // ModuleStateManager<MyModule> manager. // ... (other fields) // } // struct Vtab : sqlite::Module<MyModule>::Vtab { // // Store the per-vtab-state pointer in the vtab object. // ModuleStateManager<MyModule>::PerVtabState* state; // ... (other fields) // } // static void OnCreate(...) { // ... // // Call OnCreate on the manager object and store the returned pointer. // tab->state = ctx->manager.OnCreate(argv); // ... // } // static void OnDestroy(...) { // ... // // Call OnDestroy with the stored state pointer. // sqlite::ModuleStateManager<MyModule>::OnDestroy(tab->state); // ... // } // // Do the same in OnConnect and OnDisconnect as in OnCreate and OnDestroy // // respectively. // static void OnConnect(...) // static void OnDisconnect(...) // } template <typename Module> class ModuleStateManager { … }; } // namespace perfetto::trace_processor::sqlite #endif // SRC_TRACE_PROCESSOR_SQLITE_MODULE_LIFECYCLE_MANAGER_H_