From: <svn...@op...> - 2009-09-28 15:21:31
|
Author: bellmich Date: Mon Sep 28 17:21:15 2009 New Revision: 1290 URL: http://libsyncml.opensync.org/changeset/1290 Log: The setup of a new data sync session must be thread safe. Otherwise it can happen that two parallel threads create two new data sync sessions for one SyncML session. Modified: trunk/libsyncml/data_sync_api/sml_data_sync.c trunk/libsyncml/data_sync_api/sml_data_sync_private.h Modified: trunk/libsyncml/data_sync_api/sml_data_sync.c ============================================================================== --- trunk/libsyncml/data_sync_api/sml_data_sync.c Mon Sep 28 17:19:45 2009 (r1289) +++ trunk/libsyncml/data_sync_api/sml_data_sync.c Mon Sep 28 17:21:15 2009 (r1290) @@ -171,6 +171,8 @@ /* cleanup sessions */ g_hash_table_remove_all(self->priv->data_sync_sessions); g_hash_table_remove_all(self->priv->sessions); + if (self->priv->session_mutex) + g_mutex_free(self->priv->session_mutex); // /* cleanup authentication */ @@ -603,7 +605,7 @@ sml_data_sync_initialize (SmlDataSync *self, GError **error) { - smlTrace(TRACE_ENTRY, "%s", __func__); + smlTrace(TRACE_ENTRY, "%s (%p, %p)", __func__, self, error); sml_return_val_error_if_fail (SML_IS_DATA_SYNC (self), FALSE, error, SML_ERROR_GENERIC, "There must be a SmlDataSync object."); GList *h = self->priv->data_stores; @@ -621,6 +623,7 @@ } self->priv->manager_mutex = g_mutex_new(); + self->priv->session_mutex = g_mutex_new(); if (self->priv->func_tsp_init && !self->priv->func_tsp_init(self, error)) @@ -762,21 +765,25 @@ SmlSession *session, GError **error) { + g_mutex_lock(self->priv->session_mutex); SmlDataSyncSession *data_sync_session = g_hash_table_lookup(self->priv->sessions, session); - if (data_sync_session) { - return data_sync_session; - } else { + if (!data_sync_session) { data_sync_session = sml_data_sync_session_new(session, self, error); if (!data_sync_session) - return NULL; + goto error; g_hash_table_insert(self->priv->data_sync_sessions, data_sync_session, data_sync_session); g_hash_table_insert(self->priv->sessions, session, data_sync_session); g_object_ref(data_sync_session); g_object_ref(data_sync_session); g_object_ref(data_sync_session); smlSessionRef(session); - return data_sync_session; } + g_mutex_unlock(self->priv->session_mutex); + smlTrace(TRACE_EXIT, "%s - %p", __func__, data_sync_session); + return data_sync_session; +error: + g_mutex_unlock(self->priv->session_mutex); + return NULL; } SmlDsSessionAlertCb Modified: trunk/libsyncml/data_sync_api/sml_data_sync_private.h ============================================================================== --- trunk/libsyncml/data_sync_api/sml_data_sync_private.h Mon Sep 28 17:19:45 2009 (r1289) +++ trunk/libsyncml/data_sync_api/sml_data_sync_private.h Mon Sep 28 17:21:15 2009 (r1290) @@ -89,6 +89,7 @@ GHashTable* data_sync_sessions; GHashTable* sessions; + GMutex* session_mutex; GSourceFuncs* functions; SmlThread* thread; |