int cnt;
enum app_type_t app_type = target->app_type;
- LOGI("target[%p] close, pid(%d) : (remaining %d target)\n",
- target, target_get_pid(target), target_cnt_get() - 1);
+ LOGI("target[%p] close, pid(%d) : (remaining %d target) close ecore handler %p\n",
+ target, target_get_pid(target), target_cnt_get() - 1, target->handler);
ecore_main_fd_handler_del(target->handler);
- target_wait(target);
- target_dtor(target);
+ /* mark target uninitialised */
+ target->event_fd_released = 1;
+
// all target client are closed
cnt = target_cnt_sub_and_fetch();
if (0 == cnt) {
t->socket = UNKNOWN_FD;
t->event_fd = UNKNOWN_FD;
t->initial_log = 0;
+ t->event_fd_released = 0;
t->allocmem = 0;
t->thread = thread_ctor();
void target_dtor(struct target *t)
{
t->allocmem = 0;
+ t->event_fd_released = 0;
t->initial_log = 0;
if (t->event_fd != -1)
target_array_lock();
for (i = 0; i < MAX_TARGET_COUNT; i++) {
+ /* FIXME refactor this code: convert targer_use[] and
+ * event_fd_released to one counter variable */
+
+ /* if target_use is 1 and event_fd_released 1 targed not used
+ * 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]);
+ target_use[i] = 0;
+ }
+
if (target_use[i] == 0) {
target_use[i] = 1;
t = &target_array[i];
target_array_lock();
for (i = 0; i < MAX_TARGET_COUNT; ++i) {
+ LOGI("target_use [%d] = %d\n", i, target_use[i]);
if (target_use[i] == 0)
continue;
t = target_get(i);
+ if (close(t->socket) != 0) {
+ LOGW("target socket already closed %u:%u\n", (unsigned int)t->pid, (unsigned int)t->ppid);
+ }
- LOGI("join recv thread [%d] is started\n", i);
+ LOGI("join recv thread [%d] %u:%u is started\n", i, (unsigned int)t->pid, (unsigned int)t->ppid);
target_wait(t);
- LOGI("join recv thread %d. done\n", i);
+ LOGI("join recv thread [%d] %u:%u done\n", i, (unsigned int)t->pid, (unsigned int)t->ppid);
}
+
target_array_unlock();
+
+ for (i = 0; i < MAX_TARGET_COUNT; ++i) {
+ if (target_use[i] == 0)
+ continue;
+ t = target_get(i);
+ while (t->event_fd_released != 1) {
+ LOGI("wait uninit [%d] %u:%u\n", i, t->pid, t->ppid);
+ sleep(1);
+ }
+ LOGI("target destroy [%d] start\n", i);
+ target_dtor(t);
+ LOGI("target destroy [%d] done\n", i);
+ }
}
uint64_t target_get_total_alloc(pid_t pid)