[beast: 11/49] BEAST: introduce explicit destruction of projects to avoid leaks
- From: Tim Janik <timj src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [beast: 11/49] BEAST: introduce explicit destruction of projects to avoid leaks
- Date: Wed, 1 Jul 2015 11:30:01 +0000 (UTC)
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]