Fix double borrow in synchronous tests

Mikayla created

Change summary

crates/gpui2/src/app.rs         | 18 ++++++++++++++++++
crates/gpui2_macros/src/test.rs |  4 ++--
2 files changed, 20 insertions(+), 2 deletions(-)

Detailed changes

crates/gpui2/src/app.rs 🔗

@@ -68,9 +68,27 @@ impl AppCell {
 #[derive(Deref, DerefMut)]
 pub struct AppRef<'a>(Ref<'a, AppContext>);
 
+impl<'a> Drop for AppRef<'a> {
+    fn drop(&mut self) {
+        if let Some(_) = option_env!("TRACK_THREAD_BORROWS") {
+            let thread_id = std::thread::current().id();
+            eprintln!("dropped borrow from {thread_id:?}");
+        }
+    }
+}
+
 #[derive(Deref, DerefMut)]
 pub struct AppRefMut<'a>(RefMut<'a, AppContext>);
 
+impl<'a> Drop for AppRefMut<'a> {
+    fn drop(&mut self) {
+        if let Some(_) = option_env!("TRACK_THREAD_BORROWS") {
+            let thread_id = std::thread::current().id();
+            eprintln!("dropped {thread_id:?}");
+        }
+    }
+}
+
 pub struct App(Rc<AppCell>);
 
 /// Represents an application before it is fully launched. Once your app is

crates/gpui2_macros/src/test.rs 🔗

@@ -175,10 +175,10 @@ pub fn test(args: TokenStream, function: TokenStream) -> TokenStream {
                                 ));
                                 inner_fn_args.extend(quote!(&mut #cx_varname_lock,));
                                 cx_teardowns.extend(quote!(
-                                    dispatcher.run_until_parked();
-                                    #cx_varname_lock.quit();
                                     drop(#cx_varname_lock);
                                     dispatcher.run_until_parked();
+                                    #cx_varname.update(|cx| { cx.quit() });
+                                    dispatcher.run_until_parked();
                                 ));
                                 continue;
                             }