From 809f1566c19e77a6ccb107a34d1b8639f9dfde07 Mon Sep 17 00:00:00 2001 From: Anatolii Nikulin Date: Fri, 20 Nov 2015 13:48:45 +0300 Subject: [PATCH] [FIX] deadlock in da_manager Change-Id: If0cf631ef695c1db94762034a5c6e4adb73a6524 Signed-off-by: Anatolii Nikulin --- daemon/target.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/daemon/target.c b/daemon/target.c index 729a6ce..f70200e 100644 --- a/daemon/target.c +++ b/daemon/target.c @@ -63,7 +63,7 @@ struct target *target_ctor(void) return t; } -void target_dtor(struct target *t) +void target_clean(struct target *t) { t->allocmem = 0; t->event_fd_released = 0; @@ -76,7 +76,11 @@ void target_dtor(struct target *t) if (t->socket != UNKNOWN_FD) close(t->socket); t->socket = -1; +} +void target_dtor(struct target *t) +{ + target_clean(t); thread_dtor(t->thread); target_free(t); } @@ -169,11 +173,17 @@ static struct target *target_malloc(void) * and can be released. target_use and event_fd_released are set * in different threads asynchronously */ - if (target_use[i] == 1 && target_array[i].event_fd_released == 1) { - target_dtor(&target_array[i]); + if (target_use[i] == 1 && + target_array[i].event_fd_released == 1) { + target_clean(&target_array[i]); + thread_dtor(target_array[i].thread); + if (target_use[i] == 0) + LOGE("double free t=%p\n", &target_array[i]); target_use[i] = 0; } + } + for (i = 0; i < MAX_TARGET_COUNT; i++) { if (target_use[i] == 0) { target_use[i] = 1; t = &target_array[i]; -- 2.7.4