[beast: 11/49] BEAST: introduce explicit destruction of projects to avoid leaks



commit fbc4d8623e8e1e8da03008d73f22aa667d87222d
Author: Tim Janik <timj gnu org>
Date:   Mon Jun 22 02:17:30 2015 +0200

    BEAST: introduce explicit destruction of projects to avoid leaks

 beast-gtk/bstapp.cc        |    6 +++++-
 beast-gtk/bstfiledialog.cc |    5 ++++-
 beast-gtk/bstmain.cc       |    7 ++++++-
 beast-gtk/bstplayback.cc   |    2 ++
 bse/bseapi.idl             |    1 +
 bse/bseserver.cc           |   15 +++++++++++++--
 bse/bseserver.hh           |    1 +
 7 files changed, 32 insertions(+), 5 deletions(-)
---
diff --git a/beast-gtk/bstapp.cc b/beast-gtk/bstapp.cc
index 387c209..9147278 100644
--- a/beast-gtk/bstapp.cc
+++ b/beast-gtk/bstapp.cc
@@ -337,6 +337,7 @@ bst_app_destroy (GtkObject *object)
                             "any_signal", bst_app_reload_pages, self,
                             "any_signal", gxk_widget_update_actions, self,
                             NULL);
+      bse_server.destroy_project (self->project);
       self->project = Bse::ProjectH(); // NULL
     }
 
@@ -711,7 +712,10 @@ demo_play_song (gpointer data,
   Bse::ProjectH project = bse_server.create_project (file_name);
   BseErrorType error = bst_project_restore_from_file (project, file_name, TRUE, TRUE);
   if (error)
-    bst_status_eprintf (error, _("Opening project `%s'"), file_name);
+    {
+      bst_status_eprintf (error, _("Opening project `%s'"), file_name);
+      bse_server.destroy_project (project);
+    }
   else
     {
       BstApp *app;
diff --git a/beast-gtk/bstfiledialog.cc b/beast-gtk/bstfiledialog.cc
index 7c0d886..6a46130 100644
--- a/beast-gtk/bstfiledialog.cc
+++ b/beast-gtk/bstfiledialog.cc
@@ -415,7 +415,10 @@ bst_file_dialog_open_project (BstFileDialog *self,
   BseErrorType error = bst_project_restore_from_file (project, file_name, TRUE, TRUE);
 
   if (error)
-    bst_status_eprintf (error, _("Opening project `%s'"), file_name);
+    {
+      bst_status_eprintf (error, _("Opening project `%s'"), file_name);
+      bse_server.destroy_project (project);
+    }
   else
     {
       bse_project_get_wave_repo (project.proxy_id());
diff --git a/beast-gtk/bstmain.cc b/beast-gtk/bstmain.cc
index 2cfbc40..c40af2b 100644
--- a/beast-gtk/bstmain.cc
+++ b/beast-gtk/bstmain.cc
@@ -270,7 +270,10 @@ main (int   argc,
                  gtk_widget_hide (beast_splash);
                }
               else
-                sfi_error (_("Failed to load wave file \"%s\": %s"), argv[i], bse_error_blurb (error));
+                {
+                 bse_server.destroy_project (project);
+                  sfi_error (_("Failed to load wave file \"%s\": %s"), argv[i], bse_error_blurb (error));
+                }
            }
           continue;
        }
@@ -302,6 +305,8 @@ main (int   argc,
               gxk_idle_show_widget (GTK_WIDGET (app));
               gtk_widget_hide (beast_splash);
             }
+          else
+            bse_server.destroy_project (project);
           if (error)
             sfi_error (_("Failed to load project \"%s\": %s"), argv[i], bse_error_blurb (error));
         }
diff --git a/beast-gtk/bstplayback.cc b/beast-gtk/bstplayback.cc
index 4c0379f..7c29f9f 100644
--- a/beast-gtk/bstplayback.cc
+++ b/beast-gtk/bstplayback.cc
@@ -183,5 +183,7 @@ bst_play_back_handle_destroy (BstPlayBackHandle *handle)
 
   if (handle->pcm_timeout)
     g_source_remove (handle->pcm_timeout);
+
+  bse_server.destroy_project (handle->project);
   delete handle;
 }
diff --git a/bse/bseapi.idl b/bse/bseapi.idl
index cbcac7a..bfd91ac 100644
--- a/bse/bseapi.idl
+++ b/bse/bseapi.idl
@@ -190,6 +190,7 @@ interface Server : Object {
   bool          can_load (String file_name); ///< Check whether a loader can be found for a wave file.
   void          start_recording (String wave_file, float64 n_seconds); ///< Start recording to a WAV file.
   Project       create_project (String project_name); ///< Create a new project (name is modified to be 
unique if necessary.
+  void          destroy_project (Project project);    ///< Destroy a previously created new project.
 };
 
 } // Bse
diff --git a/bse/bseserver.cc b/bse/bseserver.cc
index a24c845..9898d34 100644
--- a/bse/bseserver.cc
+++ b/bse/bseserver.cc
@@ -1435,7 +1435,7 @@ ServerImpl::can_load (const String &file_name)
 }
 
 static void
-destroy_project (BseProject *project, BseServer *server)
+release_project (BseProject *project, BseServer *server)
 {
   server->projects = g_list_remove (server->projects, project);
   bse_item_unuse (project);
@@ -1460,9 +1460,20 @@ ServerImpl::create_project (const String &project_name)
   g_object_unref (project);
   g_free (uname);
   g_object_connect (project,
-                   "signal::release", destroy_project, server,
+                   "signal::release", release_project, server,
                    NULL);
   return shared_ptr_cast<ProjectIface> (project->as<ProjectIface*>());
 }
 
+void
+ServerImpl::destroy_project (ProjectIface &project_iface)
+{
+  BseServer *server = as<BseServer*>();
+  BseProject *project = project_iface.as<BseProject*>();
+  if (g_list_find (server->projects, project))
+    g_object_run_dispose (project);
+  else
+    critical ("%s: project not found", __func__);
+}
+
 } // Bse
diff --git a/bse/bseserver.hh b/bse/bseserver.hh
index 37860f7..9c283bc 100644
--- a/bse/bseserver.hh
+++ b/bse/bseserver.hh
@@ -126,6 +126,7 @@ public:
   virtual int    n_scripts               () override;
   virtual bool   can_load                (const String &file_name) override;
   virtual ProjectIfaceP create_project   (const String &project_name) override;
+  virtual void          destroy_project  (ProjectIface &project) override;
   void                  send_user_message   (const UserMessage &umsg);
   static ServerImpl&    instance            ();
 };


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]