Add new routine to check waiting count 40/105240/1 accepted/tizen/common/20161220.191011 accepted/tizen/ivi/20161220.223818 accepted/tizen/mobile/20161220.223649 accepted/tizen/tv/20161220.223723 accepted/tizen/unified/20170309.031621 accepted/tizen/wearable/20161220.223751 submit/tizen/20161220.104958 submit/tizen_unified/20170308.100404
authorJeongmo Yang <jm80.yang@samsung.com>
Fri, 16 Dec 2016 05:42:10 +0000 (14:42 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Fri, 16 Dec 2016 05:42:10 +0000 (14:42 +0900)
If some API's return value is come lately from muse server after waiting timeout, api_activating can be true.
Then, previous return value is returned if same API is called.
This patch resolves it.

[Version] 0.2.91
[Profile] Common
[Issue Type] Update
[Dependency module] N/A
[Test] [M(T) - Boot=(OK), sdb=(OK), Home=(OK), Touch=(OK), Version=tizen-3.0-mobile_20161215.3]

Change-Id: I328e1587ef838c9a7ce35d510bfdd1170b70d355
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
include/camera_private.h
packaging/capi-media-camera.spec
src/camera.c

index 5cd5337..f1d3cd5 100644 (file)
@@ -116,6 +116,7 @@ typedef struct _camera_cb_info_s {
        GCond api_cond[MUSE_CAMERA_API_MAX];
        GMutex api_mutex[MUSE_CAMERA_API_MAX];
        gint api_activating[MUSE_CAMERA_API_MAX];
+       gint api_waiting[MUSE_CAMERA_API_MAX];
        gint api_ret[MUSE_CAMERA_API_MAX];
 
        /* general message handler info */
index 260c2de..6aa000c 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-camera
 Summary:    A Camera API
-Version:    0.2.90
+Version:    0.2.91
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 088d4e6..6388caa 100644 (file)
@@ -51,6 +51,7 @@ static int g_cam_dev_state_changed_cb_id;
 static GDBusConnection *g_cam_dev_state_changed_cb_conn;
 static guint g_cam_dev_state_changed_cb_subscribe_id;
 
+
 static void __global(void *data, struct wl_registry *registry,
        uint32_t name, const char *interface, uint32_t version)
 {
@@ -262,6 +263,25 @@ _DONE:
 }
 
 
+static void __camera_update_api_waiting(camera_cb_info_s *cb_info, int api, int value)
+{
+       if (!cb_info ||
+               api < 0 || api >= MUSE_CAMERA_API_MAX) {
+               LOGE("invalid param %p %d", cb_info, api);
+               return;
+       }
+
+       g_mutex_lock(&(cb_info->api_mutex[api]));
+       cb_info->api_waiting[api] += value;
+       g_mutex_unlock(&(cb_info->api_mutex[api]));
+
+       /*LOGD("api %d, value %d, waiting %d",
+               api, value, cb_info->api_waiting[api]);*/
+
+       return;
+}
+
+
 static void __camera_device_state_changed_cb(GDBusConnection *connection,
        const gchar *sender_name, const gchar *object_path, const gchar *interface_name,
        const gchar *signal_name, GVariant *param, gpointer user_data)
@@ -436,6 +456,8 @@ static void _camera_msg_send(int api, camera_cb_info_s *cb_info,
        /*LOGD("send msg %s", msg);*/
 
        if (cb_info->is_server_connected) {
+               __camera_update_api_waiting(cb_info, api, 1);
+
                g_mutex_lock(&cb_info->fd_lock);
                send_ret = muse_core_ipc_send_msg(cb_info->fd, msg);
                g_mutex_unlock(&cb_info->fd_lock);
@@ -450,6 +472,8 @@ static void _camera_msg_send(int api, camera_cb_info_s *cb_info,
                        *ret = _camera_client_wait_for_cb_return(api, cb_info, timeout);
        }
 
+       __camera_update_api_waiting(cb_info, api, -1);
+
        muse_core_msg_json_factory_free(msg);
 
        return;
@@ -501,6 +525,8 @@ static void _camera_msg_send_param1(int api, camera_cb_info_s *cb_info,
        /*LOGD("send msg %s", msg);*/
 
        if (cb_info->is_server_connected) {
+               __camera_update_api_waiting(cb_info, api, 1);
+
                g_mutex_lock(&cb_info->fd_lock);
                send_ret = muse_core_ipc_send_msg(cb_info->fd, msg);
                g_mutex_unlock(&cb_info->fd_lock);
@@ -516,6 +542,8 @@ static void _camera_msg_send_param1(int api, camera_cb_info_s *cb_info,
                        *ret = _camera_client_wait_for_cb_return(api, cb_info, timeout);
        }
 
+       __camera_update_api_waiting(cb_info, api, -1);
+
        muse_core_msg_json_factory_free(msg);
 
        return;
@@ -1617,12 +1645,16 @@ static void *_camera_msg_handler_func(gpointer data)
                        g_mutex_lock(&cb_info->api_mutex[api]);
 
                        if (muse_camera_msg_get(ret, cam_msg->recv_msg)) {
-                               cb_info->api_ret[api] = ret;
-                               cb_info->api_activating[api] = 1;
+                               if (cb_info->api_waiting[api] > 0) {
+                                       cb_info->api_ret[api] = ret;
+                                       cb_info->api_activating[api] = 1;
 
-                               /*LOGD("t:%d camera api %d - return 0x%x", type, ret);*/
+                                       /*LOGD("t:%d camera api %d - return 0x%x", type, ret);*/
 
-                               g_cond_signal(&cb_info->api_cond[api]);
+                                       g_cond_signal(&cb_info->api_cond[api]);
+                               } else {
+                                       LOGW("no waiting for this api [%d]", api);
+                               }
                        } else {
                                LOGE("t:%d failed to get camera ret for api %d, msg %s", type, api, cam_msg->recv_msg);
                        }
@@ -1860,9 +1892,6 @@ static void __camera_process_msg(camera_cb_info_s *cb_info, char *msg)
 
                g_mutex_lock(&cb_info->api_mutex[api]);
 
-               cb_info->api_ret[api] = ret;
-               cb_info->api_activating[api] = 1;
-
                switch (api) {
                case MUSE_CAMERA_API_CREATE:
                        if (ret != CAMERA_ERROR_NONE) {
@@ -1917,7 +1946,15 @@ static void __camera_process_msg(camera_cb_info_s *cb_info, char *msg)
                        break;
                }
 
-               g_cond_signal(&cb_info->api_cond[api]);
+               if (cb_info->api_waiting[api] > 0) {
+                       cb_info->api_ret[api] = ret;
+                       cb_info->api_activating[api] = 1;
+
+                       g_cond_signal(&cb_info->api_cond[api]);
+               } else {
+                       LOGW("no waiting for this api [%d]", api);
+               }
+
                g_mutex_unlock(&cb_info->api_mutex[api]);
        } else if (api_class == MUSE_CAMERA_API_CLASS_THREAD_SUB || api == MUSE_CAMERA_CB_EVENT) {
                __camera_add_msg_to_queue(cb_info, api, event, event_class, msg);
@@ -2167,6 +2204,8 @@ static camera_cb_info_s *_camera_client_callback_new(gint sockfd)
                goto ErrorExit;
        }
 
+       cb_info->api_waiting[MUSE_CAMERA_API_CREATE] = 1;
+
        for (i = 0 ; i < MUSE_CAMERA_API_MAX ; i++) {
                g_mutex_init(&cb_info->api_mutex[i]);
                g_cond_init(&cb_info->api_cond[i]);
@@ -2524,6 +2563,9 @@ int camera_create(camera_device_e device, camera_h *camera)
        LOGD("cb info : %d", pc->cb_info->fd);
 
        ret = _camera_client_wait_for_cb_return(api, pc->cb_info, CAMERA_CB_TIMEOUT);
+
+       pc->cb_info->api_waiting[MUSE_CAMERA_API_CREATE] = 0;
+
        if (ret == CAMERA_ERROR_NONE) {
                intptr_t handle = 0;
                muse_camera_msg_get_pointer(handle, pc->cb_info->recv_msg);
@@ -3169,6 +3211,8 @@ int camera_set_display(camera_h camera, camera_display_type_e type, camera_displ
                }
 
                if (pc->cb_info->is_server_connected) {
+                       __camera_update_api_waiting(pc->cb_info, api, 1);
+
                        g_mutex_lock(&pc->cb_info->fd_lock);
                        send_ret = muse_core_ipc_send_msg(pc->cb_info->fd, msg);
                        g_mutex_unlock(&pc->cb_info->fd_lock);
@@ -3181,6 +3225,8 @@ int camera_set_display(camera_h camera, camera_display_type_e type, camera_displ
                        ret = _camera_client_wait_for_cb_return(api, pc->cb_info, CAMERA_CB_TIMEOUT);
                }
 
+               __camera_update_api_waiting(pc->cb_info, api, -1);
+
                muse_core_msg_json_factory_free(msg);
 
                LOGD("wayland parent id : %d, window %d,%d,%dx%d",
@@ -4851,6 +4897,8 @@ int camera_attr_set_geotag(camera_h camera, double latitude, double longitude, d
        }
 
        if (pc->cb_info->is_server_connected) {
+               __camera_update_api_waiting(pc->cb_info, api, 1);
+
                g_mutex_lock(&pc->cb_info->fd_lock);
                send_ret = muse_core_ipc_send_msg(pc->cb_info->fd, msg);
                g_mutex_unlock(&pc->cb_info->fd_lock);
@@ -4863,6 +4911,8 @@ int camera_attr_set_geotag(camera_h camera, double latitude, double longitude, d
                ret = _camera_client_wait_for_cb_return(api, pc->cb_info, CAMERA_CB_TIMEOUT);
        }
 
+       __camera_update_api_waiting(pc->cb_info, api, -1);
+
        muse_core_msg_json_factory_free(msg);
 
        LOGD("ret : 0x%x", ret);
@@ -6429,6 +6479,8 @@ int camera_attr_set_display_roi_area(camera_h camera, int x, int y, int width, i
        }
 
        if (pc->cb_info->is_server_connected) {
+               __camera_update_api_waiting(pc->cb_info, api, 1);
+
                g_mutex_lock(&pc->cb_info->fd_lock);
                send_ret = muse_core_ipc_send_msg(pc->cb_info->fd, msg);
                g_mutex_unlock(&pc->cb_info->fd_lock);
@@ -6441,6 +6493,8 @@ int camera_attr_set_display_roi_area(camera_h camera, int x, int y, int width, i
                ret = _camera_client_wait_for_cb_return(api, pc->cb_info, CAMERA_CB_TIMEOUT);
        }
 
+       __camera_update_api_waiting(pc->cb_info, api, -1);
+
        muse_core_msg_json_factory_free(msg);
 
        LOGD("ret : 0x%x", ret);