From c733a41d10cbbedb6c57ee93539f29a2e2551353 Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Thu, 28 Apr 2022 11:43:27 +0200 Subject: [PATCH] Add design documentation for improved memory management --- .../docs/development/wrapper_cache.drawio.svg | 451 ++++++++++++++++++ website/docs/development/wrapper_caching.md | 25 + .../development/wrapper_keep_alive_seq.png | Bin 0 -> 96150 bytes .../development/wrapper_keep_alive_seq.puml | 94 ++++ 4 files changed, 570 insertions(+) create mode 100644 website/docs/development/wrapper_cache.drawio.svg create mode 100644 website/docs/development/wrapper_caching.md create mode 100644 website/docs/development/wrapper_keep_alive_seq.png create mode 100644 website/docs/development/wrapper_keep_alive_seq.puml diff --git a/website/docs/development/wrapper_cache.drawio.svg b/website/docs/development/wrapper_cache.drawio.svg new file mode 100644 index 000000000..bc6303e04 --- /dev/null +++ b/website/docs/development/wrapper_cache.drawio.svg @@ -0,0 +1,451 @@ + + + + + + + +
+
+
+ + QScreen + +
+ <<cpp>> +
+
+
+
+ + QScreen... + +
+
+ + + + + + +
+
+
+ + QClipboard + +
+ <<ts>> +
+
+
+
+ + QClipboard... + +
+
+ + + + + + +
+
+
+ + QScreen + +
+ <<ts>> +
+
+
+
+ + QScreen... + +
+
+ + + + + + + + +
+
+
+ + WrapperCache + +
+ <<ts>> +
+
+
+
+ + WrapperCache... + +
+
+ + + + +
+
+
+ + WrapperCache + +
+ <<cpp>> +
+
+
+
+ + WrapperCache... + +
+
+ + + + + +
+
+
+ QPointer instance +
+
+
+
+ + QPointer instance + +
+
+ + + + +
+
+
+ + QScreenWrap + +
+ <<Napi>> +
+
+
+
+ + QScreenWrap... + +
+
+ + + + + + +
+
+
+ + JS / TS + +
+
+
+
+ + JS / TS + +
+
+ + + + +
+
+
+ + V8 bindings (C++) + +
+
+
+
+ + V8 bindings (... + +
+
+ + + + +
+
+
+ + Qt + +
+
+
+
+ + Qt + +
+
+ + + + +
+
+
+ + "Wrapper Keep Alive" case (Instance diagram) + +
+
+
+
+ + "Wrapper Keep Alive" case (Insta... + +
+
+ + + + + +
+
+
+ QPointer instance +
+
+
+
+ + QPointer instance + +
+
+ + + + +
+
+
+ + QClipboardWrap + +
+ <<Napi>> +
+
+
+
+ + QClipboardWrap... + +
+
+ + + + +
+
+
+ + QClipboard + +
+ <<cpp>> +
+
+
+
+ + QClipboard... + +
+
+ + + + +
+
+
+ Map QObject +
+ <-> +
+ Cpp Wrapper +
+
+
+
+ + Map QObject... + +
+
+ + + + + + + + +
+
+
+ Map QObject +
+ <-> +
+ Cpp Wrapper +
+
+
+
+ + Map QObject... + +
+
+ + + + + + + + + +
+
+
+ QObject destroyed +
+ signal +
+
+
+
+ + QObject destroyed... + +
+
+ + + + + +
+
+
+ Object destroyed +
+ callback +
+
+
+
+ + Object destroyed... + +
+
+ + + + + +
+
+
+ QObject destroyed +
+ signal +
+
+
+
+ + QObject destroyed... + +
+
+ + + + + + + + +
+
+
+ JS strong reference +
+
+
+
+ + JS strong reference + +
+
+ + + + +
+
+
+ Cpp reference/pointer +
+
+
+
+ + Cpp reference/pointer + +
+
+
+ + + + + Viewer does not support full SVG 1.1 + + + +
\ No newline at end of file diff --git a/website/docs/development/wrapper_caching.md b/website/docs/development/wrapper_caching.md new file mode 100644 index 000000000..b7ba9aa7c --- /dev/null +++ b/website/docs/development/wrapper_caching.md @@ -0,0 +1,25 @@ +# Wrapper caching and memory management + + + +## "Wrapper Keep Alive" case + +The goal of the "Wrapper Keep Alive" case is to maintain and "keep alive" wrappers for the life-time of a `QObject` whose life-cycle is under complete control by Qt itself. i.e. Qt may expose the object, but it creates the instance itself and also destroys it later on. This situation applies to `QScreen` and `QClipboard` for example. A common use case for keeping a wrapper alive is to receive and relay signals from a `QObject` back to JS during the object's life-time. + +![Wrapper cache diagram](wrapper_cache.drawio.svg) + +The WrapperCache (C++) holds strong JS references to the Napi wrapper instances. This keeps them alive. When the core QObject is destroyed the "destroyed" signal is emitted and received by WrapperCache (C++). It then removes the Napi wrapper from its cache and uses a callback function to inform the WrapperCache (JS) about the destruction. WrapperCache (JS) can also perform clean up and null out references to the Napi wrappers. If someone then tries to use a JS side wrapper, then will get a JS side null pointer exception with stacktrace. + +**Life-cycle Sequence** + +This sequence diagram shows the events when the application calls `QWindow.screen()` to fetch the `QScreen` for the window. The `QScreen` instance is fully created and managed by Qt. Here you can see how the wrapper creation interacts with the JS and C++ side cache classes. You can also see how the wrappers are gracefully shutdown when the core Qt object is destroyed. Any JS side use of the destroyed wrapper / Qt object results in a neat JS side null pointer exception. This is much better than null pointer segfault on the C++ side. + +![Wrapper keep alive sequence diagram](wrapper_keep_alive_seq.png) + + +## "Wrapper Recycle" case + +A related use case is where we want to "recycle" wrappers and ensure that for a QObject we only have one coresponding JS wrapper active at the same time. For example, repeated calls to `QObject.parent()` should return the same value/object. + +Another goal of this use case is to ensure that the unexpected destruction of the underlying QObject is handled in a more graceful and helpful way than just segfaulting the whole application. This requires the tracking of the QObject via its "destroy" signal and using that to communicate back to JS what has happened. + diff --git a/website/docs/development/wrapper_keep_alive_seq.png b/website/docs/development/wrapper_keep_alive_seq.png new file mode 100644 index 0000000000000000000000000000000000000000..0bbc0adf40c3cd319e3dc61d378d584349d92553 GIT binary patch literal 96150 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ⅈ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 i)my}g4uGl0#5I> #E3C800 +participant "QWindow.ts" as qwindowts << ts>> #E3C800 +participant "QScreen.ts" as qscreents << ts>> #E3C800 +participant "WrapperCache" as wrappercachets << ts>> #E3C800 +participant "QWindowWrap" as qwindowwrap << cpp >> +participant "QScreenWrap" as qscreenwrap << cpp >> +participant "WrapperCache" as wrappercachecpp << cpp >> +participant "QWindow" as qwindow << cpp >> #D5E8D4 +participant "QScreen" as qscreen << cpp >> #D5E8D4 + + +== Wrapper construction == + +activate qscreen +app --> qwindowts: QWindow.screen() +qwindowts --> qwindowwrap: screen() +qwindowwrap --> qwindow: screen() +qwindow --> qwindowwrap: QScreen instance +qwindowwrap --> wrappercachecpp: get() +wrappercachecpp --> qscreenwrap: new() +activate qscreenwrap +qscreenwrap --> wrappercachecpp: QScreenWrap instance +wrappercachecpp --> qscreen: connect to destroy signal +wrappercachecpp --> qwindowwrap: QScreenWrap instance +qwindowwrap --> qwindowts: QScreenWrap instance +qwindowts --> wrappercachets: get(QScreenWrap instance) +wrappercachets --> qscreents: new(QScreenWrap instance) +activate qscreents +qscreents --> wrappercachets: QScreen.ts instance +wrappercachets --> qwindowts: QScreen.ts instance +qwindowts --> app: QScreen.ts instance + +note across: The app can use the QScreen wrap and run. + +== Qt object destruction == +note over qscreen + Qt decides to destroy + the QScreen instance +end note +qscreen --> wrappercachecpp: destroy signal +destroy qscreen +wrappercachecpp --> wrappercachets: destroy callback + +note over wrappercachecpp + WrapperCache removes + references to the wrapper + and Qt object from cache. +end note + +wrappercachets --> qscreents: null the ref to QScreenWrap +note over wrappercachets + WrapperCache.ts removes + references to the QScreen.ts + instance and QScreenWrap +end note + +destroy qscreenwrap +note over qscreenwrap + V8's GC will destroy + this automatically +end note + +app --> qscreents +note over app + Any use of QScreen.ts + will hit the null reference + and throw a JS exception. +end note +app --> qscreents + +destroy qscreents +note over qscreents + V8's GC will destroy + this automatically +end note + +@enduml