goto cleanup;
}
+ g_mutex_init(&g_focus_sound_handle[index].focus_lock);
focus_init_callback(index, false);
cleanup:
goto cleanup;
}
- if (!g_mutex_trylock(&g_focus_sound_handle[index].focus_lock)) {
- debug_warning("maybe focus_callback is being called, try one more time..");
- usleep(2500000); /* 2.5 sec */
- if (g_mutex_trylock(&g_focus_sound_handle[index].focus_lock))
- debug_msg("finally got focus_lock");
- }
+ g_mutex_lock(&g_focus_sound_handle[index].focus_lock);
+
+ g_focus_sound_handle[index].is_destroying = true;
ret = mm_sound_proxy_unregister_focus(index);
if (ret == MM_ERROR_NONE)
else
debug_error("Error occurred : 0x%x", ret);
- g_mutex_unlock(&g_focus_sound_handle[index].focus_lock);
-
focus_deinit_callback(index, false);
g_focus_sound_handle[index].focus_fd = 0;
g_focus_sound_handle[index].focus_pid = 0;
g_focus_sound_handle[index].is_used = false;
focus_deinit_context(index, false);
+ g_mutex_unlock(&g_focus_sound_handle[index].focus_lock);
+ g_mutex_clear(&g_focus_sound_handle[index].focus_lock);
+
+ g_focus_sound_handle[index].is_destroying = false;
cleanup:
MMSOUND_LEAVE_CRITICAL_SECTION(&g_index_mutex);
debug_fleave();
return FALSE;
}
#ifdef __DEBUG__
- debug_warning("CHECK : %p, 0x%x ]", source, fsource->pollfd.revents);
+ debug_warning("CHECK : %p, 0x%x ]", source, fsource->poll_fd.revents);
#endif
if (fsource->poll_fd.revents & (POLLIN | POLLPRI))
return TRUE;
debug_error("fsrc is null");
return G_SOURCE_REMOVE;
}
+ if (focus_handle->is_destroying) {
+ debug_warning("focus_handle is destroying now, skip it");
+ return G_SOURCE_REMOVE;
+ }
+
+ g_mutex_lock(&focus_handle->focus_lock);
poll_fd = &focus_handle->fsrc->poll_fd;
debug_msg("focus_handle(%p), poll_fd(%p)", focus_handle, poll_fd);
char str_error[256];
strerror_r(errno, str_error, sizeof(str_error));
debug_error("GpollFD read fail, errno=%d(%s)", errno, str_error);
+ g_mutex_unlock(&focus_handle->focus_lock);
return G_SOURCE_CONTINUE;
}
changed_state = cb_data.state;
- g_mutex_lock(&focus_handle->focus_lock);
-
tid = focus_handle->focus_pid;
if (changed_state != -1) {
debug_fenter();
- g_mutex_init(&g_focus_sound_handle[index].focus_lock);
-
src = g_source_new(&event_funcs, sizeof(FocusSource));
if (!src) {
debug_error("failed to g_source_new for focus source");
h->focus_callback = NULL;
h->watch_callback = NULL;
- g_mutex_clear(&h->focus_lock);
-
debug_msg("callbacks of focus handle[%d] are cleared", index);
return true;