Use the loop for the cond_wait 52/215352/5 tizen
authorGilbok Lee <gilbok.lee@samsung.com>
Mon, 7 Oct 2019 08:58:50 +0000 (17:58 +0900)
committerGilbok Lee <gilbok.lee@samsung.com>
Mon, 21 Oct 2019 05:55:19 +0000 (14:55 +0900)
- cond_wait can be a spurious wakeup
- cond_wait can be called after the signal

Change-Id: I7025a52ba572d73f86db1fffbecdefd2dd4688ea

include/rose_tizen_priv.h
packaging/capi-media-rose-tizen.spec
src/rose_tizen.c
src/rose_tizen_sem_parse.c
test/rose_tizen_test.c

index f8715f091be7aa8e859fdc27a573b5d8755834b1..a10e4cc91c4d372ecbc8d20ebe8c34b9042634f8 100644 (file)
@@ -127,6 +127,7 @@ do { \
 
 typedef struct _rose_render {
        GMutex mutex;
+       gboolean cond_signaled;
        GCond cond;
 
        GMutex pause_mutex;
index cda1417c4d942b10819d6bb7082ce197574c9a86..b6c9d38597a52d26c2e3f04e5269c8009eea36c1 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-rose-tizen
 Summary:    For RoSE(Representation Of Sensory Effect) APIs
-Version:    0.0.7
+Version:    0.0.8
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index dd5bbdab7e3e58038419be2207530a941bf7dd5e..cb9efd0c25338ddfc2774280ae8ad2d19ef45c06 100644 (file)
 #include "rose_tizen_priv.h"
 
 static gpointer _rose_render_thread(gpointer data);
-static gint _wait_to_render(gpointer data);
 static gboolean _create_render_thread(rose_s *handle);
 static void _destroy_render_thread(rose_s *handle);
+
+static void _start_mplayer(rose_s *handle);
+
 static gint64 _get_running_time(rose_render *renderer);
 static void _rose_apply_delay(rose_s *handle);
-static void _start_mplayer(rose_s *handle);
+
+static gint _wait_render_timer(gpointer data);
 static guint _calc_wait_time(gint64 next_pts, gint64 cur_pts);
+static void _wait_render_time_out(rose_s *handle, guint wait_time);
 
 int rose_create(rose_h *rose)
 {
@@ -351,6 +355,7 @@ int rose_stop(rose_h rose)
        }
        renderer->cur_sem_list = NULL;
        renderer->last_sem_list = NULL;
+       renderer->cond_signaled = TRUE;
        _RENDER_COND_SIGNAL(renderer);
        if (renderer->mplayer_is_started) {
                ret = _rose_mplayer_stop(handle->mplayer_intf);
@@ -384,6 +389,7 @@ int rose_pause(rose_h rose)
                g_source_remove(renderer->wait_timer);
                renderer->wait_timer = 0;
        }
+       renderer->cond_signaled = TRUE;
        _RENDER_COND_SIGNAL(renderer);
        if (renderer->mplayer_is_started) {
                ret = _rose_mplayer_pause(handle->mplayer_intf);
@@ -508,9 +514,7 @@ static gpointer _rose_render_thread(gpointer data)
                if (cur_pts <= 0 && next_pts >= 0 && !renderer->mplayer_is_started) {
                        wait_time = _calc_wait_time(0, cur_pts);
                        LOGD("Need to mplayer start");
-                       LOGD("add wait timer %u ms", wait_time);
-                       renderer->wait_timer = g_timeout_add(wait_time, (GSourceFunc)_wait_to_render, handle);
-                       _RENDER_COND_WAIT(renderer);
+                       _wait_render_time_out(handle, wait_time);
                        _start_mplayer(handle);
                        cur_pts = 0;
                        if (renderer->thread_pause || renderer->thread_exit)
@@ -518,10 +522,8 @@ static gpointer _rose_render_thread(gpointer data)
                }
 
                wait_time = _calc_wait_time(next_pts, cur_pts);
-               LOGD("add wait timer %u ms", wait_time);
                renderer->cur_sem_list = next_list;
-               renderer->wait_timer = g_timeout_add(wait_time, (GSourceFunc)_wait_to_render, handle);
-               _RENDER_COND_WAIT(renderer);
+               _wait_render_time_out(handle, wait_time);
                if (renderer->thread_pause || renderer->thread_exit)
                        continue;
 
@@ -534,6 +536,7 @@ static gpointer _rose_render_thread(gpointer data)
                ret = _rose_device_ctl_activate(handle->device_ctl_intf, cur_list->data);
                if (ret)
                        LOGW("Error activate device control");
+
                cur_list = cur_list->next;
        }
 
@@ -543,7 +546,7 @@ static gpointer _rose_render_thread(gpointer data)
        return NULL;
 }
 
-static gint _wait_to_render(gpointer data)
+static gint _wait_render_timer(gpointer data)
 {
        rose_s *handle = (rose_s *)data;
        gint64 render_time = 0;
@@ -558,9 +561,7 @@ static gint _wait_to_render(gpointer data)
 
        sem = ROSE_GET_SEM(handle);
        renderer = ROSE_GET_RENDERER(handle);
-
        LOGD("Called wait_render timer");
-       g_usleep(1000);
 
        if (!renderer->mplayer_is_started)
                render_time = 0;
@@ -575,8 +576,10 @@ static gint _wait_to_render(gpointer data)
        }
 
 ERROR:
-       _RENDER_COND_SIGNAL(renderer);
-
+       if (!renderer->cond_signaled) {
+               renderer->cond_signaled = TRUE;
+               _RENDER_COND_SIGNAL(renderer);
+       }
        return FALSE;
 }
 
@@ -626,6 +629,7 @@ static void _destroy_render_thread(rose_s *handle)
                g_source_remove(renderer->wait_timer);
                renderer->wait_timer = 0;
        }
+       renderer->cond_signaled = TRUE;
        _RENDER_COND_SIGNAL(renderer);
        _RENDER_PAUSE_COND_SIGNAL(renderer);
        g_thread_join(renderer->thread);
@@ -700,5 +704,18 @@ static guint _calc_wait_time(gint64 next_pts, gint64 cur_pts)
        if ((next_pts - cur_pts - DEFAULT_CHECK_TIME_MS) > 0)
                wait_time = next_pts - cur_pts - DEFAULT_CHECK_TIME_MS;
 
+       LOGD("add wait timer %u ms", wait_time);
        return wait_time;
 }
+
+static void _wait_render_time_out(rose_s *handle, guint wait_time)
+{
+       ROSE_CHECK_NULL_VOID(handle);
+       rose_render *renderer = ROSE_GET_RENDERER(handle);
+       ROSE_CHECK_NULL_VOID(renderer);
+
+       renderer->cond_signaled = FALSE;
+       renderer->wait_timer = g_timeout_add(wait_time, (GSourceFunc)_wait_render_timer, handle);
+       while (!renderer->cond_signaled)
+               _RENDER_COND_WAIT(renderer);
+}
\ No newline at end of file
index 485b66e11c1d0a3d2313ed3671fd80097d7b42d3..fac6f82aa92b4206eb2da9d8288662ad4fb1a49e 100644 (file)
@@ -377,7 +377,8 @@ static gboolean _parse_effect_base_attr(xmlNode *node, rose_sem_base_attr **attr
 
 static void _save_effect_base_attr(rose_sem_effect_elements *effect, rose_sem_base_attr *attr)
 {
-       ROSE_CHECK_NULL_VOID(effect && attr);
+       ROSE_CHECK_NULL_VOID(effect);
+       ROSE_CHECK_NULL_VOID(attr);
 
        if (!effect->base_attr) {
                LOGD("copy parent base attr");
@@ -413,7 +414,8 @@ static void _save_effect_base_attr(rose_sem_effect_elements *effect, rose_sem_ba
 
 static void _save_si_attr(rose_sem_effect_elements *effect, rose_sem_si_attr *attr)
 {
-       ROSE_CHECK_NULL_VOID(effect && attr);
+       ROSE_CHECK_NULL_VOID(effect);
+       ROSE_CHECK_NULL_VOID(attr);
 
        if (!effect->si_attr) {
                LOGD("copy parent si attr");
index ac229c32477967d1b4bf0436e6c68eb77244d4bb..d7c86de5969e587a9a8136d9f8f96be16b7fada7 100644 (file)
@@ -277,6 +277,7 @@ int test_rose_destroy()
        int ret = 0;
        LOGD("test_rose_destroy");
        ret = rose_destroy(rose);
+       rose = NULL;
        return ret;
 }
 
@@ -420,6 +421,12 @@ void _interpret_main_menu(char *cmd)
                        test_rose_destroy();
                } else if (strncmp(cmd, "ds", 2) == 0) {
                        g_menu_state = CURRENT_STATUS_DISPLAY_SURFACE_CHANGE;
+               } else if (strncmp(cmd, "aa", 2) == 0) {
+                       test_rose_create();
+                       test_rose_set_media_path("/home/owner/e.mp4");
+                       test_rose_set_sem_path("/home/owner/e.xml");
+                       test_rose_set_control_info_path("/home/owner/c.xml");
+                       test_rose_prepare();
                }
        }
        return;