aboutsummaryrefslogtreecommitdiff
path: root/main/src/ui/conversation_content_view/call_widget.vala
diff options
context:
space:
mode:
authorChristopher Vollick <0@psycoti.ca>2023-09-14 15:12:58 -0400
committerMarvin W <git@larma.de>2024-04-28 21:36:27 +0200
commitd473efcbfe3603fac62594bd9d8fee8b23ffcbe5 (patch)
treeec7d09a8ac92b3ab434b383ab02215aa2632055b /main/src/ui/conversation_content_view/call_widget.vala
parentba83a4ba3d6886b711278b8804566dcbe8ad7621 (diff)
downloaddino-d473efcbfe3603fac62594bd9d8fee8b23ffcbe5.tar.gz
dino-d473efcbfe3603fac62594bd9d8fee8b23ffcbe5.zip
Add WeakTimeout Pattern to Prevent Leaks
While doing testing I noticed that skeletons were being leaked, and eventually tracked it down to the timer that updates the time label closing over "this" and then keeping the reference alive, potentially for 24 hours. I noticed a few other places in the code doing some version of this, and one of them had the "static and weak pointer" approach, which I pulled out into a util class. Now, we still have to make sure we're passing it a static method instead of a lambda, as that would also close over "this" and render the whole thing useless, but at least most of the annoying parts live in the util class now. Also the call_widget version was doing a weird thing where it was removing itself, but then returning "true"? I'm not sure what that accomplishes, because returning "false" means to not run this again. So I think my new version is the same in practice, but simpler... There are other timeouts in the code that I briefly looked over, but all of them seemed to be relatively short hard-coded durations, so I left them alone. But if any of them are long-lived, it's possible they could also benefit from this class in the future. Closes #1480 Co-Authored-By: Marvin W <git@larma.de>
Diffstat (limited to 'main/src/ui/conversation_content_view/call_widget.vala')
-rw-r--r--main/src/ui/conversation_content_view/call_widget.vala13
1 files changed, 5 insertions, 8 deletions
diff --git a/main/src/ui/conversation_content_view/call_widget.vala b/main/src/ui/conversation_content_view/call_widget.vala
index ab047196..3d6b250b 100644
--- a/main/src/ui/conversation_content_view/call_widget.vala
+++ b/main/src/ui/conversation_content_view/call_widget.vala
@@ -111,6 +111,10 @@ namespace Dino.Ui {
incoming_call_revealer.reveal_child = true;
}
+ private void on_time_update_timeout() {
+ if (time_update_handler_id != 0) update_call_state();
+ }
+
private void update_call_state() {
incoming_call_revealer.reveal_child = false;
incoming_call_revealer.remove_css_class("incoming");
@@ -156,14 +160,7 @@ namespace Dino.Ui {
string duration = get_duration_string((new DateTime.now_utc()).difference(call.local_time));
subtitle_label.label = _("Started %s ago").printf(duration);
- time_update_handler_id = Timeout.add_seconds(get_next_time_change() + 1, () => {
- if (time_update_handler_id != 0) {
- Source.remove(time_update_handler_id);
- time_update_handler_id = 0;
- update_call_state();
- }
- return true;
- });
+ time_update_handler_id = Dino.WeakTimeout.add_seconds_once(get_next_time_change() + 1, this, on_time_update_timeout);
break;
case Call.State.OTHER_DEVICE: