From a3b87ece92efc7171e83a32236a1f15a6f5e3a31 Mon Sep 17 00:00:00 2001 From: Phil Longstaff Date: Fri, 11 Dec 2009 17:31:35 +0000 Subject: [PATCH] Add qof_finalize_backend_libraries() which is called during shutdown. This routine checks each backend library for an exported qof_backend_module_finalize() routine, and if it exists, calls it so that the backend can free any resources which have been allocated. git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@18485 57a11ea4-9604-0410-9ed3-97b8803252fd --- src/libqof/qof/qofbackend.c | 20 ++++++++++++++++++++ src/libqof/qof/qofbackend.h | 3 +++ src/libqof/qof/qofutil.c | 1 + 3 files changed, 24 insertions(+) diff --git a/src/libqof/qof/qofbackend.c b/src/libqof/qof/qofbackend.c index ef02c7bdb9..4f9061de85 100644 --- a/src/libqof/qof/qofbackend.c +++ b/src/libqof/qof/qofbackend.c @@ -502,6 +502,8 @@ qof_backend_commit_exists(const QofBackend *be) } } +static GSList* backend_module_list = NULL; + gboolean qof_load_backend_library (const char *directory, const char* module_name) { @@ -523,7 +525,25 @@ qof_load_backend_library (const char *directory, const char* module_name) module_init_func(); g_module_make_resident(backend); + backend_module_list = g_slist_prepend( backend_module_list, backend ); return TRUE; } +void +qof_finalize_backend_libraries(void) +{ + GSList* node; + GModule* backend; + void (*module_finalize_func) (void); + + for (node = backend_module_list; node != NULL; node = node->next) { + backend = (GModule*)node->data; + + if (g_module_symbol(backend, "qof_backend_module_finalize", + (gpointer)&module_finalize_func)) + module_finalize_func(); + + } +} + /************************* END OF FILE ********************************/ diff --git a/src/libqof/qof/qofbackend.h b/src/libqof/qof/qofbackend.h index 4934131c0c..a4f24063c7 100644 --- a/src/libqof/qof/qofbackend.h +++ b/src/libqof/qof/qofbackend.h @@ -269,6 +269,9 @@ KvpFrame* qof_backend_get_config(QofBackend *be); gboolean qof_load_backend_library(const gchar *directory, const gchar* module_name); +/** \brief Finalize all loaded backend sharable libraries. */ +void qof_finalize_backend_libraries(void); + /** \brief Retrieve the backend used by this book */ QofBackend* qof_book_get_backend (const QofBook *book); diff --git a/src/libqof/qof/qofutil.c b/src/libqof/qof/qofutil.c index 24bcbb7cdb..ce45e7382e 100644 --- a/src/libqof/qof/qofutil.c +++ b/src/libqof/qof/qofutil.c @@ -523,6 +523,7 @@ qof_close(void) qof_query_shutdown (); qof_object_shutdown (); guid_shutdown (); + qof_finalize_backend_libraries(); qof_util_string_cache_destroy (); qof_log_shutdown(); }