On Mon, 2005-04-25 at 22:48 -0500, Hans Petter Jansson wrote:
> Could you wrap these in static mutexes so there's no way we'll leak in a
> threaded environment?
I'm not very experienced at threaded considerations, but how does the
attached patch look?
Note that this patch also removes a call to
e_book_backend_get_static_capabilities() in e-data-book.c, for which the
result was not used.
Ross
--
Ross Burton mail: ross burtonini com
jabber: ross burtonini com
www: http://www.burtonini.com./
PGP Fingerprint: 1A21 F5B0 D8D0 CFE3 81D4 E25A 2D09 E447 D0B4 33DF
Index: libebook/e-book-listener.c
===================================================================
--- libebook/e-book-listener.c (revision 7)
+++ libebook/e-book-listener.c (working copy)
@@ -402,16 +402,17 @@
EBookListener *
e_book_listener_new ()
{
+ static GStaticMutex mutex = G_STATIC_MUTEX_INIT;
+ static PortableServer_POA poa = NULL;
EBookListener *listener;
- static PortableServer_POA poa = NULL;
-
+
+ g_static_mutex_lock (&mutex);
if (poa == NULL)
poa = bonobo_poa_get_threaded (ORBIT_THREAD_HINT_ON_CONTEXT, _ebook_context, NULL);
+ g_static_mutex_unlock (&mutex);
+
+ listener = g_object_new (E_TYPE_BOOK_LISTENER, "poa", poa, NULL);
- listener = g_object_new (E_TYPE_BOOK_LISTENER,
- "poa", poa,
- NULL);
-
return listener;
}
Index: libebook/e-book-view-listener.c
===================================================================
--- libebook/e-book-view-listener.c (revision 7)
+++ libebook/e-book-view-listener.c (working copy)
@@ -284,16 +284,17 @@
EBookViewListener *
e_book_view_listener_new ()
{
+ static GStaticMutex mutex = G_STATIC_MUTEX_INIT;
+ static PortableServer_POA poa = NULL;
EBookViewListener *listener;
- static PortableServer_POA poa = NULL;
+ g_static_mutex_lock (&mutex);
if (poa == NULL)
poa = bonobo_poa_get_threaded (ORBIT_THREAD_HINT_PER_OBJECT, NULL);
-
- listener = g_object_new (E_TYPE_BOOK_VIEW_LISTENER,
- "poa", poa,
- NULL);
+ g_static_mutex_unlock (&mutex);
+ listener = g_object_new (E_TYPE_BOOK_VIEW_LISTENER, "poa", poa, NULL);
+
listener->priv->queue = g_async_queue_new();
listener->priv->idle_mutex = g_mutex_new();
listener->priv->idle_id = -1;
Index: libedata-book/e-data-book.c
===================================================================
--- libedata-book/e-data-book.c (revision 4)
+++ libedata-book/e-data-book.c (working copy)
@@ -788,17 +788,19 @@
ESource *source,
GNOME_Evolution_Addressbook_BookListener listener)
{
+ static GStaticMutex mutex = G_STATIC_MUTEX_INIT;
+ static PortableServer_POA poa = NULL;
EDataBook *book;
- char *caps = e_book_backend_get_static_capabilities (backend);
- book = g_object_new (E_TYPE_DATA_BOOK,
- "poa", bonobo_poa_get_threaded (ORBIT_THREAD_HINT_PER_REQUEST, NULL),
- NULL);
+ g_static_mutex_lock (&mutex);
+ if (poa == NULL)
+ poa = bonobo_poa_get_threaded (ORBIT_THREAD_HINT_PER_REQUEST, NULL);
+ g_static_mutex_unlock (&mutex);
+ book = g_object_new (E_TYPE_DATA_BOOK, "poa", poa, NULL);
+
e_data_book_construct (book, backend, source, listener);
- g_free (caps);
-
return book;
}
Index: libedata-book/e-data-book-factory.c
===================================================================
--- libedata-book/e-data-book-factory.c (revision 6)
+++ libedata-book/e-data-book-factory.c (working copy)
@@ -384,11 +384,16 @@
EDataBookFactory *
e_data_book_factory_new (void)
{
+ static GStaticMutex mutex = G_STATIC_MUTEX_INIT;
+ static PortableServer_POA poa = NULL;
EDataBookFactory *factory;
- factory = g_object_new (E_TYPE_DATA_BOOK_FACTORY,
- "poa", bonobo_poa_get_threaded (ORBIT_THREAD_HINT_PER_REQUEST, NULL),
- NULL);
+ g_static_mutex_lock (&mutex);
+ if (poa == NULL)
+ poa = bonobo_poa_get_threaded (ORBIT_THREAD_HINT_PER_REQUEST, NULL);
+ g_static_mutex_unlock (&mutex);
+
+ factory = g_object_new (E_TYPE_DATA_BOOK_FACTORY, "poa", poa, NULL);
e_data_book_factory_construct (factory);
Index: libedata-book/e-data-book-view.c
===================================================================
--- libedata-book/e-data-book-view.c (revision 4)
+++ libedata-book/e-data-book-view.c (working copy)
@@ -461,11 +461,16 @@
EBookBackendSExp *card_sexp,
int max_results)
{
+ static GStaticMutex mutex = G_STATIC_MUTEX_INIT;
+ static PortableServer_POA poa = NULL;
EDataBookView *book_view;
- book_view = g_object_new (E_TYPE_DATA_BOOK_VIEW,
- "poa", bonobo_poa_get_threaded (ORBIT_THREAD_HINT_PER_OBJECT, NULL),
- NULL);
+ g_static_mutex_lock (&mutex);
+ if (poa == NULL)
+ poa = bonobo_poa_get_threaded (ORBIT_THREAD_HINT_PER_OBJECT, NULL);
+ g_static_mutex_unlock (&mutex);
+
+ book_view = g_object_new (E_TYPE_DATA_BOOK_VIEW, "poa", poa, NULL);
e_data_book_view_construct (book_view, backend, listener, card_query, card_sexp, max_results);
Attachment:
signature.asc
Description: This is a digitally signed message part