diff options
author | Jeongmo Yang <jm80.yang@samsung.com> | 2016-12-16 14:42:10 +0900 |
---|---|---|
committer | Jeongmo Yang <jm80.yang@samsung.com> | 2016-12-16 14:42:10 +0900 |
commit | 1b09e2d8e06370b7a243153db217e80e451b316f (patch) | |
tree | d65d127aa188f0d3ba8ad87129e73cf5c0a24d58 | |
parent | e4430ec88174c5a6316507667da043c897104d26 (diff) | |
download | camera-1b09e2d8e06370b7a243153db217e80e451b316f.tar.gz camera-1b09e2d8e06370b7a243153db217e80e451b316f.tar.bz2 camera-1b09e2d8e06370b7a243153db217e80e451b316f.zip |
Add new routine to check waiting countsubmit/tizen_unified/20170308.100404submit/tizen/20161220.104958accepted/tizen/wearable/20161220.223751accepted/tizen/unified/20170309.031621accepted/tizen/tv/20161220.223723accepted/tizen/mobile/20161220.223649accepted/tizen/ivi/20161220.223818accepted/tizen/common/20161220.191011
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>
-rw-r--r-- | include/camera_private.h | 1 | ||||
-rw-r--r-- | packaging/capi-media-camera.spec | 2 | ||||
-rw-r--r-- | src/camera.c | 70 |
3 files changed, 64 insertions, 9 deletions
diff --git a/include/camera_private.h b/include/camera_private.h index 5cd5337..f1d3cd5 100644 --- a/include/camera_private.h +++ b/include/camera_private.h @@ -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 */ diff --git a/packaging/capi-media-camera.spec b/packaging/capi-media-camera.spec index 260c2de..6aa000c 100644 --- a/packaging/capi-media-camera.spec +++ b/packaging/capi-media-camera.spec @@ -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 diff --git a/src/camera.c b/src/camera.c index 088d4e6..6388caa 100644 --- a/src/camera.c +++ b/src/camera.c @@ -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); |