#include <sys/time.h>
#define CALLBACK_TIMEOUT 2500 /* millisecond */
+#define INVOKE_CHECK_INTERVAL_MS 30
static GList *g_focus_node_list = NULL;
static pthread_mutex_t g_focus_node_list_mutex = PTHREAD_MUTEX_INITIALIZER;
static stream_list_t g_stream_list;
+static gint g_on_invoke_ref;
+
static const char* focus_status_str[] = {
"DEACTIVATED",
"P ACTIVATED",
debug_log("focus-pipe(%s) removed", filename);
}
+static void __wait_for_callback_completion(void)
+{
+ unsigned int retry_count = 0;
+
+ debug_fenter();
+
+ /* wait for watch invoke completion or timeout(2500ms) */
+ while (g_atomic_int_get(&g_on_invoke_ref) > 0) {
+ usleep(INVOKE_CHECK_INTERVAL_MS * 1000);
+
+ if (INVOKE_CHECK_INTERVAL_MS * retry_count++ > CALLBACK_TIMEOUT) {
+ debug_warning("timeout for callback completion, still remaining of %d", g_atomic_int_get(&g_on_invoke_ref));
+ return;
+ }
+ }
+
+ debug_msg("wait done, retry_count[%d]", retry_count);
+
+ debug_fleave();
+}
+
+
static void __clear_focus_pipe(focus_node_t *node)
{
debug_fenter();
+ __wait_for_callback_completion();
+
__remove_focus_pipe(node, false);
__remove_focus_pipe(node, true);
return MM_ERROR_INVALID_ARGUMENT;
}
+ g_atomic_int_inc(&g_on_invoke_ref);
+
for (list = g_focus_node_list; list != NULL; list = list->next) {
SET_NODE_FROM_LIST_DATA(node, list);
if (node == my_node)
_invoke_watch_callback(node, my_node->stream_type, focus_type, command, param);
}
+ if (g_atomic_int_dec_and_test(&g_on_invoke_ref)) {
+ debug_msg("no remaining watch invoke");
+ } else {
+ debug_warning("still watch invoke remains in other place");
+ }
+
debug_fleave();
return MM_ERROR_NONE;