Implement deadlock checker. To enable this function, compile with TDM_CONFIG_MUTEX_TI... 02/67102/2
authorAndrii Sokolenko <a.sokolenko@samsung.com>
Mon, 25 Apr 2016 07:45:16 +0000 (10:45 +0300)
committerBoram Park <boram1288.park@samsung.com>
Mon, 25 Apr 2016 14:13:48 +0000 (07:13 -0700)
Change-Id: I20e04366aaefa7dd1369a482028cb3c2b4e7c47f
Signed-off-by: Andrii Sokolenko <a.sokolenko@samsung.com>
src/tdm_private.h

index 50417f9..6cd2185 100644 (file)
@@ -453,26 +453,45 @@ tdm_helper_get_dump_count(void);
 char *
 tdm_helper_get_dump_path(void);
 
-#define _pthread_mutex_lock(l) \
+#define _pthread_mutex_unlock(l) \
        do { \
                if (tdm_debug_mutex) \
-                       TDM_INFO("mutex lock"); \
-               pthread_mutex_lock(l); \
+                       TDM_INFO("mutex unlock"); \
                pthread_mutex_lock(&tdm_mutex_check_lock); \
-               tdm_mutex_locked = 1; \
+               tdm_mutex_locked = 0; \
                pthread_mutex_unlock(&tdm_mutex_check_lock); \
+               pthread_mutex_unlock(l); \
        } while (0)
-
-#define _pthread_mutex_unlock(l) \
+#ifdef TDM_CONFIG_MUTEX_TIMEOUT
+#define MUTEX_TIMEOUT_SEC 5
+#define _pthread_mutex_lock(l) \
        do { \
                if (tdm_debug_mutex) \
-                       TDM_INFO("mutex unlock"); \
+                       TDM_INFO("mutex lock"); \
+               struct timespec rtime; \
+               clock_gettime(CLOCK_REALTIME, &rtime); \
+               rtime.tv_sec += MUTEX_TIMEOUT_SEC; \
+               if (pthread_mutex_timedlock(l, &rtime)) { \
+                       TDM_ERR("Mutex lock failed PID %d", getpid()); \
+                       _pthread_mutex_unlock(l); \
+               } \
+               else { \
+                       pthread_mutex_lock(&tdm_mutex_check_lock); \
+                       tdm_mutex_locked = 1; \
+                       pthread_mutex_unlock(&tdm_mutex_check_lock); \
+               } \
+       } while (0)
+#else //TDM_CONFIG_MUTEX_TIMEOUT
+#define _pthread_mutex_lock(l) \
+       do { \
+               if (tdm_debug_mutex) \
+                       TDM_INFO("mutex lock"); \
+               pthread_mutex_lock(l); \
                pthread_mutex_lock(&tdm_mutex_check_lock); \
-               tdm_mutex_locked = 0; \
+               tdm_mutex_locked = 1; \
                pthread_mutex_unlock(&tdm_mutex_check_lock); \
-               pthread_mutex_unlock(l); \
        } while (0)
-
+#endif //TDM_CONFIG_MUTEX_TIMEOUT
 //#define TDM_MUTEX_IS_LOCKED() (tdm_mutex_locked == 1)
 static inline int TDM_MUTEX_IS_LOCKED(void)
 {