[maemo-commits] [maemo-commits] r12741 - in projects/haf/trunk/libosso: . debian src

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Mon Jul 16 15:32:06 EEST 2007
Author: kihamala
Date: 2007-07-16 15:32:02 +0300 (Mon, 16 Jul 2007)
New Revision: 12741

Modified:
   projects/haf/trunk/libosso/configure.ac
   projects/haf/trunk/libosso/debian/changelog
   projects/haf/trunk/libosso/debian/rules
   projects/haf/trunk/libosso/src/osso-cp-plugin.c
   projects/haf/trunk/libosso/src/osso-hw.c
   projects/haf/trunk/libosso/src/osso-init.c
   projects/haf/trunk/libosso/src/osso-internal.h
   projects/haf/trunk/libosso/src/osso-rpc.c
Log:
implemented some thread safety code


Modified: projects/haf/trunk/libosso/configure.ac
===================================================================
--- projects/haf/trunk/libosso/configure.ac	2007-07-15 16:51:00 UTC (rev 12740)
+++ projects/haf/trunk/libosso/configure.ac	2007-07-16 12:32:02 UTC (rev 12741)
@@ -1,7 +1,7 @@
 # -*- sh -*-
 AC_INIT([libosso], [2.0])
 AC_CONFIG_SRCDIR([src/libosso.h])
-AM_INIT_AUTOMAKE([-Wall -Werror])
+AM_INIT_AUTOMAKE([-Wall])
 AM_CONFIG_HEADER([config.h])
 AC_LANG(C)
 #AC_GNU_SOURCE
@@ -42,7 +42,7 @@
 ## g_array_index gives bogus warnings for -Wcast-align on ARM, so we
 ## don't us that warning as well.
 
-WFLAGS="-Werror -Wall -Wmissing-prototypes -std=c99"
+WFLAGS="-Wall -Wmissing-prototypes -std=c99"
 if test x${libosso_use_debug} = xyes ; then
     AC_DEFINE([LIBOSSO_DEBUG],1,[Build extra debug code])
     OSSO_CFLAGS="-g -ansi -D_BSD_SOURCE -rdynamic $WFLAGS"

Modified: projects/haf/trunk/libosso/debian/changelog
===================================================================
--- projects/haf/trunk/libosso/debian/changelog	2007-07-15 16:51:00 UTC (rev 12740)
+++ projects/haf/trunk/libosso/debian/changelog	2007-07-16 12:32:02 UTC (rev 12741)
@@ -1,3 +1,10 @@
+libosso (2.14~unreleased) unstable; urgency=low
+
+  * Added some thread safety.
+  * Removed -Werror from compilation options.
+
+ -- Kimmo Hämäläinen <kimmo.hamalainen at nokia.com>  Mon, 16 Jul 2007 15:17:41 +0300
+
 libosso (2.13-1) unstable; urgency=low
 
   * Fix some warnings in osso-state.c when using -pedantic

Modified: projects/haf/trunk/libosso/debian/rules
===================================================================
--- projects/haf/trunk/libosso/debian/rules	2007-07-15 16:51:00 UTC (rev 12740)
+++ projects/haf/trunk/libosso/debian/rules	2007-07-16 12:32:02 UTC (rev 12741)
@@ -11,7 +11,7 @@
 DEB_HOST_GNU_TYPE   ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
 DEB_BUILD_GNU_TYPE  ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
 
-CFLAGS += -Wall -g -ansi -Werror -Wshadow -D_GNU_SOURCE
+CFLAGS += -Wall -g -ansi -Wshadow -D_GNU_SOURCE
 CFLAGS += -O$(if $(findstring noopt,$(DEB_BUILD_OPTIONS)),0,2)
 # Use soft-float and thumb mode if it is enabled.
 CFLAGS += $(if $(findstring thumb,$(DEB_BUILD_OPTIONS)),-mthumb)

Modified: projects/haf/trunk/libosso/src/osso-cp-plugin.c
===================================================================
--- projects/haf/trunk/libosso/src/osso-cp-plugin.c	2007-07-15 16:51:00 UTC (rev 12740)
+++ projects/haf/trunk/libosso/src/osso-cp-plugin.c	2007-07-16 12:32:02 UTC (rev 12741)
@@ -95,11 +95,20 @@
       return NULL;
     }
 
+  if (pthread_mutex_lock (&osso->mutex) == EDEADLK)
+    {
+      ULOG_ERR_F("mutex deadlock detected");
+      return NULL;
+    }
+
   if (osso->cp_plugins)
     handle = g_hash_table_lookup (osso->cp_plugins, libname);
 
   if (handle)
-    return handle;
+    {
+      pthread_mutex_unlock (&osso->mutex);
+      return handle;
+    }
 
   handle = dlopen (libname, RTLD_LAZY | RTLD_LOCAL);
   if (handle == NULL)
@@ -108,6 +117,7 @@
     }
 
   g_hash_table_insert (osso->cp_plugins, g_strdup (libname), handle);
+  pthread_mutex_unlock (&osso->mutex);
   return handle;
 }
 
@@ -207,9 +217,16 @@
         return OSSO_OK;
     }
 
+    if (pthread_mutex_lock (&osso->mutex) == EDEADLK)
+    {
+        ULOG_ERR_F("mutex deadlock detected");
+        return OSSO_ERROR;
+    }
+
     if (osso->cp_plugins)
       handle = g_hash_table_lookup(osso->cp_plugins, filename);
 
+    pthread_mutex_unlock (&osso->mutex);
     if (handle) {
 	osso_return_t ret;
 	osso_cp_plugin_save_state_f *ss = NULL;

Modified: projects/haf/trunk/libosso/src/osso-hw.c
===================================================================
--- projects/haf/trunk/libosso/src/osso-hw.c	2007-07-15 16:51:00 UTC (rev 12740)
+++ projects/haf/trunk/libosso/src/osso-hw.c	2007-07-16 12:32:02 UTC (rev 12741)
@@ -155,6 +155,11 @@
 
     dbus_error_init(&error);
 
+    if (pthread_mutex_lock(&osso->mutex) == EDEADLK) {
+        ULOG_ERR_F("mutex deadlock detected");
+        return OSSO_ERROR;
+    }
+
     if (state->shutdown_ind) {
         osso->hw_cbs.shutdown_ind.cb = cb;
         osso->hw_cbs.shutdown_ind.data = data;
@@ -163,6 +168,7 @@
             dbus_bus_add_match(osso->sys_conn, "type='signal',interface='"
                 MCE_SIGNAL_IF "',member='" MCE_SHUTDOWN_SIG "'", &error);
             if (dbus_error_is_set(&error)) {
+                pthread_mutex_unlock(&osso->mutex);
                 ULOG_ERR_F("dbus_bus_add_match failed: %s", error.message);
                 dbus_error_free(&error);
                 return OSSO_ERROR;
@@ -181,6 +187,7 @@
             dbus_bus_add_match(osso->sys_conn, "type='signal',interface='"
                 USER_LOWMEM_OFF_SIGNAL_IF "'", &error);
             if (dbus_error_is_set(&error)) {
+                pthread_mutex_unlock(&osso->mutex);
                 ULOG_ERR_F("dbus_bus_add_match failed: %s", error.message);
                 dbus_error_free(&error);
                 return OSSO_ERROR;
@@ -188,6 +195,7 @@
             dbus_bus_add_match(osso->sys_conn, "type='signal',interface='"
                 USER_LOWMEM_ON_SIGNAL_IF "'", &error);
             if (dbus_error_is_set(&error)) {
+                pthread_mutex_unlock(&osso->mutex);
                 ULOG_ERR_F("dbus_bus_add_match failed: %s", error.message);
                 dbus_error_free(&error);
                 return OSSO_ERROR;
@@ -213,6 +221,7 @@
             dbus_bus_add_match(osso->sys_conn, "type='signal',interface='"
                 MCE_SIGNAL_IF "',member='" MCE_DATA_SAVE_SIG "'", &error);
             if (dbus_error_is_set(&error)) {
+                pthread_mutex_unlock(&osso->mutex);
                 ULOG_ERR_F("dbus_bus_add_match failed: %s", error.message);
                 dbus_error_free(&error);
                 return OSSO_ERROR;
@@ -230,6 +239,7 @@
             dbus_bus_add_match(osso->sys_conn, "type='signal',interface='"
                 MCE_SIGNAL_IF "',member='" MCE_INACTIVITY_SIG "'", &error);
             if (dbus_error_is_set(&error)) {
+                pthread_mutex_unlock(&osso->mutex);
                 ULOG_ERR_F("dbus_bus_add_match failed: %s", error.message);
                 dbus_error_free(&error);
                 return OSSO_ERROR;
@@ -248,6 +258,7 @@
             dbus_bus_add_match(osso->sys_conn, "type='signal',interface='"
                 MCE_SIGNAL_IF "',member='" MCE_DEVICE_MODE_SIG "'", &error);
             if (dbus_error_is_set(&error)) {
+                pthread_mutex_unlock(&osso->mutex);
                 ULOG_ERR_F("dbus_bus_add_match failed: %s", error.message);
                 dbus_error_free(&error);
                 return OSSO_ERROR;
@@ -259,6 +270,7 @@
         } 
         osso->hw_cbs.sig_device_mode_ind.set = TRUE;
     }
+    pthread_mutex_unlock(&osso->mutex);
 
     if (install_mce_handler) {
         _msg_handler_set_cb_f(osso,
@@ -301,6 +313,10 @@
 	state = (osso_hw_state_t*) &default_mask;
     }
 
+    if (pthread_mutex_lock(&osso->mutex) == EDEADLK) {
+        ULOG_ERR_F("mutex deadlock detected");
+        return OSSO_ERROR;
+    }
     _unset_state_cb(shutdown_ind);
     if (state->memory_low_ind && osso->hw_cbs.memory_low_ind.set) {
         osso->hw_cbs.memory_low_ind.cb = NULL;
@@ -310,6 +326,8 @@
                 USER_LOWMEM_OFF_SIGNAL_IF "'", NULL);
         dbus_bus_remove_match(osso->sys_conn, "type='signal',interface='"
                 USER_LOWMEM_ON_SIGNAL_IF "'", NULL);
+
+        pthread_mutex_unlock(&osso->mutex);
         _msg_handler_rm_cb_f(osso, USER_LOWMEM_OFF_SIGNAL_SVC,
                              USER_LOWMEM_OFF_SIGNAL_OP,
                              USER_LOWMEM_OFF_SIGNAL_IF,
@@ -320,17 +338,23 @@
                              USER_LOWMEM_ON_SIGNAL_IF,
                              (const _osso_handler_f*)lowmem_signal_handler,
                              NULL, FALSE);
+        if (pthread_mutex_lock(&osso->mutex) == EDEADLK) {
+            ULOG_ERR_F("mutex deadlock detected");
+            return OSSO_ERROR;
+        }
     }
     _unset_state_cb(save_unsaved_data_ind);
     _unset_state_cb(system_inactivity_ind);
     _unset_state_cb(sig_device_mode_ind);
 
     if (_state_is_unset()) {
+        pthread_mutex_unlock(&osso->mutex);
 	_msg_handler_rm_cb_f(osso, MCE_SERVICE,
                              MCE_SIGNAL_PATH, MCE_SIGNAL_IF,
                              (const _osso_handler_f*)signal_handler,
                              NULL, FALSE);
     }
+    pthread_mutex_unlock(&osso->mutex);
     return OSSO_OK;    
 }
 

Modified: projects/haf/trunk/libosso/src/osso-init.c
===================================================================
--- projects/haf/trunk/libosso/src/osso-init.c	2007-07-15 16:51:00 UTC (rev 12740)
+++ projects/haf/trunk/libosso/src/osso-init.c	2007-07-16 12:32:02 UTC (rev 12741)
@@ -181,10 +181,15 @@
 {
     if(osso == NULL) return;
     
+    if (pthread_mutex_lock(&osso->mutex) == EDEADLK) {
+        ULOG_ERR_F("mutex deadlock detected");
+        return;
+    }
     _dbus_disconnect(osso, FALSE);
     _dbus_disconnect(osso, TRUE);
     
-    _deinit(osso);
+    pthread_mutex_unlock(&osso->mutex);
+    _deinit(osso); /* mutex is destroyed here */
     
     return;
 }
@@ -319,6 +324,7 @@
 static osso_context_t *_init(const gchar *application, const gchar *version)
 {
     osso_context_t *osso;
+    pthread_mutex_t mutex_attr;
     
     if (!_validate(application, version)) {
 	ULOG_ERR_F("invalid arguments");
@@ -352,6 +358,10 @@
     osso->cp_plugins = g_hash_table_new(g_str_hash, g_str_equal);
     osso->rpc_timeout = -1;
     osso->next_handler_id = 1;
+
+    pthread_mutexattr_init(&mutex_attr);
+    pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_ERRORCHECK_NP);
+    pthread_mutex_init(&osso->mutex, &mutex_attr);
     return osso;
 }
 
@@ -359,6 +369,7 @@
                                    const char *version)
 {
     osso_context_t *osso;
+    pthread_mutex_t mutex_attr;
     
     if (!_validate(application, version)) {
 	ULOG_ERR_F("invalid arguments");
@@ -389,6 +400,10 @@
     osso->cp_plugins = g_hash_table_new(g_str_hash, g_str_equal);
     osso->rpc_timeout = -1;
     osso->next_handler_id = 1;
+
+    pthread_mutexattr_init(&mutex_attr);
+    pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_ERRORCHECK_NP);
+    pthread_mutex_init(&osso->mutex, &mutex_attr);
     return osso;
 }
 
@@ -399,6 +414,12 @@
     if (osso == NULL) {
 	return;
     }
+
+    if (pthread_mutex_lock(&osso->mutex) == EDEADLK) {
+        ULOG_ERR_F("mutex deadlock detected");
+        return;
+    }
+
     if (osso->uniq_hash != NULL) {
         g_hash_table_destroy(osso->uniq_hash);
     }
@@ -414,11 +435,14 @@
     if (osso->cp_plugins != NULL) {
         g_hash_table_destroy(osso->cp_plugins);
     }
-    
+
 #ifdef LIBOSSO_DEBUG
     g_log_remove_handler(NULL, osso->log_handler);
     osso->log_handler = 0;
 #endif
+    pthread_mutex_unlock(&osso->mutex);
+    pthread_mutex_destroy(&osso->mutex);
+
     memset(osso, 0, sizeof(osso_context_t));
     free(osso);
     osso = NULL;
@@ -603,6 +627,12 @@
     }
 
     ULOG_DEBUG_F("key = '%s'", interface);
+
+    if (pthread_mutex_lock(&osso->mutex) == EDEADLK) {
+        ULOG_ERR_F("mutex deadlock detected");
+        return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+    }
+
     elem = g_hash_table_lookup(osso->if_hash, interface);
 
     if (elem != NULL) {
@@ -630,6 +660,7 @@
             list = g_slist_next(list);
         }
     } 
+    pthread_mutex_unlock(&osso->mutex);
 #ifdef OSSOLOG_COMPILE
     if (!found) {
         ULOG_DEBUG_F("suitable handler not found from the hash table");
@@ -797,7 +828,6 @@
     muali = data;
 
     assert(muali != NULL);
-    muali->cur_conn = conn;
 
     msgtype = muali_convert_msgtype(dbus_message_get_type(msg));
     if (msgtype == MUALI_EVENT_NONE) {
@@ -805,6 +835,12 @@
     }
     reply_to = dbus_message_get_reply_serial(msg);
 
+    if (pthread_mutex_lock(&muali->mutex) == EDEADLK) {
+        ULOG_ERR_F("mutex deadlock detected");
+        return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+    }
+
+    muali->cur_conn = conn;
     elem_list = opm_match(muali, dbus_message_get_path(msg),
                           dbus_message_get_member(msg));
 
@@ -920,6 +956,7 @@
 
         elem_list_p = g_slist_next(elem_list_p);
     }
+    pthread_mutex_unlock(&muali->mutex);
     
     if (elem_list != NULL) {
         g_slist_free(elem_list);
@@ -1050,6 +1087,11 @@
     handler->can_free_data = can_free_data;
     handler->handler_id = osso->next_handler_id++;
 
+    if (pthread_mutex_lock(&osso->mutex) == EDEADLK) {
+        ULOG_ERR_F("mutex deadlock detected");
+        return 0;
+    }
+
     /* warn about the old element if it exists */
     old = g_hash_table_lookup(osso->uniq_hash, uniq_key);
     if (old != NULL) {
@@ -1069,6 +1111,7 @@
         /* we need to allocate a new hash table element */
         new_elem = calloc(1, sizeof(_osso_hash_value_t));
         if (new_elem == NULL) {
+            pthread_mutex_unlock(&osso->mutex);
             ULOG_ERR_F("calloc() failed");
             free(handler);
             return 0;
@@ -1076,6 +1119,7 @@
 
         new_key = strdup(uniq_key);
         if (new_key == NULL) {
+            pthread_mutex_unlock(&osso->mutex);
             ULOG_ERR_F("strdup() failed");
             free(handler);
             free(new_elem);
@@ -1088,8 +1132,10 @@
     }
 
     if (add_to_if_hash(osso, handler, interface)) {
+        pthread_mutex_unlock(&osso->mutex);
         return handler->handler_id;
     } else {
+        pthread_mutex_unlock(&osso->mutex);
         return 0;
     }
 }
@@ -1123,6 +1169,7 @@
     char opm_key[MAX_OPM_HASH_KEY_LEN + 1];
     _osso_hash_value_t *old;
     _osso_handler_t *elem;
+    gboolean ret;
 
     assert(context != NULL && handler != NULL && data != NULL);
     assert(handler_id != 0);
@@ -1141,6 +1188,11 @@
     elem->call_once_per_handler_id = call_once_per_handler_id;
     /* other members are not used and left zero */
 
+    if (pthread_mutex_lock(&context->mutex) == EDEADLK) {
+        ULOG_ERR_F("mutex deadlock detected");
+        return FALSE;
+    }
+
     old = g_hash_table_lookup(context->id_hash, GINT_TO_POINTER(handler_id));
     if (old != NULL) {
         ULOG_DEBUG_F("registering another handler for id %d", handler_id);
@@ -1156,6 +1208,7 @@
         /* we need to allocate a new hash table element */
         new_elem = calloc(1, sizeof(_osso_hash_value_t));
         if (new_elem == NULL) {
+            pthread_mutex_unlock(&context->mutex);
             ULOG_ERR_F("calloc() failed");
             free(elem);
             return FALSE;
@@ -1167,7 +1220,9 @@
                             new_elem);
     }
 
-    return add_to_opm_hash(context, elem, opm_key);
+    ret = add_to_opm_hash(context, elem, opm_key);
+    pthread_mutex_unlock(&context->mutex);
+    return ret;
 }
 
 static void remove_from_opm_hash(_muali_context_t *context,
@@ -1211,8 +1266,15 @@
     GSList *list;
 
     ULOG_DEBUG_F("context=%p", context);
+
+    if (pthread_mutex_lock(&context->mutex) == EDEADLK) {
+        ULOG_ERR_F("mutex deadlock detected");
+        return FALSE;
+    }
+
     elem = g_hash_table_lookup(context->id_hash, GINT_TO_POINTER(handler_id));
     if (elem == NULL) {
+        pthread_mutex_unlock(&context->mutex);
         ULOG_ERR_F("couldn't find handler_id %d from id_hash", handler_id);
         return FALSE;
     }
@@ -1271,6 +1333,7 @@
         ULOG_ERR_F("couldn't find handler_id %d from id_hash", handler_id);
         assert(0); /* this is a bug */
     }
+    pthread_mutex_unlock(&context->mutex);
 
     return TRUE;
 }
@@ -1334,6 +1397,11 @@
 
     compose_hash_key(service, object_path, interface, uniq_key);
 
+    if (pthread_mutex_lock(&osso->mutex) == EDEADLK) {
+        ULOG_ERR_F("mutex deadlock detected");
+        return FALSE;
+    }
+
     elem = g_hash_table_lookup(osso->uniq_hash, uniq_key);
     if (elem != NULL) {
         GSList *list;
@@ -1385,12 +1453,14 @@
                     if (g_slist_length(elem->handlers) == 0) {
                         g_hash_table_remove(osso->if_hash, interface);
                     }
+                    pthread_mutex_unlock(&osso->mutex);
                     return TRUE;
                 }
                 list = g_slist_next(list);
             }
         }
     }
+    pthread_mutex_unlock(&osso->mutex);
 
 #if 0
     for(i = 0; i < osso->ifs->len; i++) {

Modified: projects/haf/trunk/libosso/src/osso-internal.h
===================================================================
--- projects/haf/trunk/libosso/src/osso-internal.h	2007-07-15 16:51:00 UTC (rev 12740)
+++ projects/haf/trunk/libosso/src/osso-internal.h	2007-07-16 12:32:02 UTC (rev 12741)
@@ -36,6 +36,8 @@
 # include <stdarg.h>
 # include <string.h>
 # include <malloc.h>
+# include <pthread.h>
+# include <errno.h>
 
 # include "libosso.h"
 # include "osso-log.h"
@@ -170,6 +172,7 @@
                                context */
     const DBusMessage *reply_dummy, *error_dummy;
     gboolean muali_filters_setup;
+    pthread_mutex_t mutex;
 } _osso_af_context_t, _muali_context_t;
 
 typedef struct _muali_context_t {
@@ -200,6 +203,7 @@
                                context */
     const DBusMessage *reply_dummy, *error_dummy;
     gboolean muali_filters_setup;
+    pthread_mutex_t mutex;
 } _muali_this_type_is_not_used_t;
 
 # ifdef LIBOSSO_DEBUG

Modified: projects/haf/trunk/libosso/src/osso-rpc.c
===================================================================
--- projects/haf/trunk/libosso/src/osso-rpc.c	2007-07-15 16:51:00 UTC (rev 12740)
+++ projects/haf/trunk/libosso/src/osso-rpc.c	2007-07-16 12:32:02 UTC (rev 12741)
@@ -478,6 +478,11 @@
         return OSSO_ERROR;
     }
     
+    if (pthread_mutex_lock(&osso->mutex) == EDEADLK) {
+        ULOG_ERR_F("mutex deadlock detected");
+        return OSSO_ERROR;
+    }
+
     if (strcmp(service, osso->service) != 0
         || (use_system_bus && !osso->systembus_service_registered)
         || (!use_system_bus && !osso->sessionbus_service_registered)) {
@@ -496,10 +501,12 @@
         } else if (ret == DBUS_REQUEST_NAME_REPLY_IN_QUEUE ||
                    ret == DBUS_REQUEST_NAME_REPLY_EXISTS) {
             /* this should be impossible */
+            pthread_mutex_unlock(&osso->mutex);
             ULOG_ERR_F("dbus_bus_request_name is broken");
             free(rpc);
             return OSSO_ERROR;
         } else if (ret == -1) {
+            pthread_mutex_unlock(&osso->mutex);
             ULOG_ERR_F("dbus_bus_request_name for '%s' failed: %s",
                        service, err.message);
             dbus_error_free(&err);
@@ -515,6 +522,7 @@
             }
         }
     }
+    pthread_mutex_unlock(&osso->mutex);
 
     rpc->user_cb = cb;
     rpc->user_data = data;


More information about the maemo-commits mailing list