From: Hyunho Kang Date: Fri, 24 Mar 2017 08:39:29 +0000 (+0900) Subject: Fix callback disapeared bug X-Git-Tag: submit/tizen_3.0/20170330.025246^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=04d11fadf0e5dd168bc280e531043d8ebcf280a8;p=platform%2Fcore%2Fappfw%2Fscreen-connector.git Fix callback disapeared bug For locally declared callback function, screen_connector_toolkit_add should copy and store callback functions. Change-Id: I14ac550d5f062e03315046bedd0b69649972255f Signed-off-by: Hyunho Kang --- diff --git a/screen_connector_watcher/src/screen_connector_toolkit.c b/screen_connector_watcher/src/screen_connector_toolkit.c index 98864ff..f3e9028 100644 --- a/screen_connector_watcher/src/screen_connector_toolkit.c +++ b/screen_connector_watcher/src/screen_connector_toolkit.c @@ -248,17 +248,26 @@ EXPORT_API screen_connector_toolkit_h screen_connector_toolkit_create_handle(cha screen_connector_toolkit_ops *ops, void *data) { screen_connector_toolkit_h toolkit_h = NULL; + screen_connector_toolkit_ops *ops_copy; + + ops_copy = (screen_connector_toolkit_ops *)calloc(1, sizeof(screen_connector_toolkit_ops)); + if (ops_copy == NULL) { + LOGE("ops_copy calloc fail"); + return NULL; + } + memcpy(ops_copy, ops, sizeof(screen_connector_toolkit_ops)); toolkit_h = (screen_connector_toolkit_h)calloc(1, sizeof(struct _screen_connector_toolkit_h)); if (toolkit_h == NULL) { LOGE("toolkit_h calloc fail"); + free(ops_copy); return NULL; } toolkit_h->surface_id = surface_id; toolkit_h->appid = strdup(id); toolkit_h->instance_id = strdup(id); toolkit_h->data = data; - toolkit_h->ops = ops; + toolkit_h->ops = ops_copy; return toolkit_h; } @@ -268,6 +277,7 @@ EXPORT_API screen_connector_toolkit_h screen_connector_toolkit_add(screen_connec { screen_connector_toolkit_h toolkit_h = NULL; screen_connector_type_h type_h = NULL; + screen_connector_toolkit_ops *ops_copy; if (id == NULL || ops == NULL) { LOGE("Invalid param"); @@ -280,14 +290,23 @@ EXPORT_API screen_connector_toolkit_h screen_connector_toolkit_add(screen_connec return NULL; } + ops_copy = (screen_connector_toolkit_ops *)calloc(1, sizeof(screen_connector_toolkit_ops)); + if (ops_copy == NULL) { + LOGE("ops_copy calloc fail"); + return NULL; + } + memcpy(ops_copy, ops, sizeof(screen_connector_toolkit_ops)); + toolkit_h = (screen_connector_toolkit_h)calloc(1, sizeof(struct _screen_connector_toolkit_h)); if (toolkit_h == NULL) { LOGE("toolkit_h calloc fail"); + free(ops_copy); return NULL; } + toolkit_h->instance_id = strdup(id); toolkit_h->data = data; - toolkit_h->ops = ops; + toolkit_h->ops = ops_copy; toolkit_h->type_h = type_h; if (type_h->toolkit_table == NULL) diff --git a/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c b/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c index a442f36..5d5baa0 100644 --- a/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c +++ b/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c @@ -578,7 +578,7 @@ EXPORT_API screen_connector_toolkit_evas_h screen_connector_toolkit_evas_add(scr { screen_connector_toolkit_evas_h handle; screen_connector_toolkit_evas_ops *evas_ops; - screen_connector_toolkit_ops *toolkit_ops; + screen_connector_toolkit_ops toolkit_ops; screen_connector_type_evas_h type_h; int int_type = type; @@ -588,10 +588,9 @@ EXPORT_API screen_connector_toolkit_evas_h screen_connector_toolkit_evas_add(scr return NULL; } - toolkit_ops = (screen_connector_toolkit_ops *)calloc(1, sizeof(screen_connector_toolkit_ops)); - toolkit_ops->added_cb = __toolkit_added_cb; - toolkit_ops->updated_cb = __toolkit_update_cb; - toolkit_ops->removed_cb = __toolkit_removed_cb; + toolkit_ops.added_cb = __toolkit_added_cb; + toolkit_ops.updated_cb = __toolkit_update_cb; + toolkit_ops.removed_cb = __toolkit_removed_cb; evas_ops = (screen_connector_toolkit_evas_ops *)calloc(1, sizeof(screen_connector_toolkit_evas_ops)); if (evas_ops == NULL) { @@ -610,7 +609,7 @@ EXPORT_API screen_connector_toolkit_evas_h screen_connector_toolkit_evas_add(scr handle->ops = evas_ops; handle->data = data; handle->type_h = type_h; - handle->toolkit_h = screen_connector_toolkit_add(toolkit_ops, id, type, handle); + handle->toolkit_h = screen_connector_toolkit_add(&toolkit_ops, id, type, handle); return handle; } @@ -826,7 +825,7 @@ EXPORT_API screen_connector_toolkit_evas_h screen_connector_toolkit_evas_add_by_ { screen_connector_toolkit_evas_h handle; screen_connector_toolkit_evas_ops *evas_ops; - screen_connector_toolkit_ops *toolkit_ops; + screen_connector_toolkit_ops toolkit_ops; screen_connector_type_evas_h type_h; char rid_str[32]; @@ -836,10 +835,9 @@ EXPORT_API screen_connector_toolkit_evas_h screen_connector_toolkit_evas_add_by_ return NULL; } - toolkit_ops = (screen_connector_toolkit_ops *)calloc(1, sizeof(screen_connector_toolkit_ops)); - toolkit_ops->added_cb = __toolkit_added_cb; - toolkit_ops->updated_cb = __toolkit_update_cb; - toolkit_ops->removed_cb = __toolkit_removed_cb; + toolkit_ops.added_cb = __toolkit_added_cb; + toolkit_ops.updated_cb = __toolkit_update_cb; + toolkit_ops.removed_cb = __toolkit_removed_cb; evas_ops = (screen_connector_toolkit_evas_ops *)calloc(1, sizeof(screen_connector_toolkit_evas_ops)); if (evas_ops == NULL) { @@ -860,7 +858,7 @@ EXPORT_API screen_connector_toolkit_evas_h screen_connector_toolkit_evas_add_by_ handle->type_h = type_h; snprintf(rid_str, sizeof(rid_str), "%d", res_id); - handle->toolkit_h = screen_connector_toolkit_create_handle(rid_str, res_id, toolkit_ops, handle); + handle->toolkit_h = screen_connector_toolkit_create_handle(rid_str, res_id, &toolkit_ops, handle); screen_connector_toolkit_redirect_surface(handle->toolkit_h); return handle;