static gint serial;
g_atomic_int_inc(&serial);
+ g_atomic_int_compare_and_exchange(&serial, 0, 1);
return (uint32_t)serial;
}
void *user_data)
{
frame_broker_h broker = user_data;
- frame_context_h context;
- int ctx_pid = -1;
- uint32_t ctx_serial = 0;
- int ret;
_D("app_id(%s), inst_id(%s), pid(%d), serial(%u)",
app_id, inst_id, pid, serial);
return;
}
- __check_pre_context(broker);
- frame_context_set_inst_id(broker->context, inst_id);
- frame_context_set_pid(broker->context, pid);
-
- frame_context_get_pid(broker->context, &ctx_pid);
- frame_context_get_serial(broker->context, &ctx_serial);
- if (ctx_pid == pid && ctx_serial == serial) {
- _D("Frame context already exists");
- return;
- }
-
- ret = frame_context_create(broker, app_id, inst_id, pid, serial,
- &broker->callback, broker->user_data,
- &context);
- if (ret != FRAME_BROKER_ERROR_NONE) {
- _E("Failed to create frame context. error(%d)", ret);
- return;
- }
-
- if (broker->context) {
- _D("Destroy previous context");
- frame_context_destroy(broker->context);
- }
-
- broker->context = context;
- frame_context_on_create(context);
+ frame_context_set_inst_id(broker->pre_context, inst_id);
+ frame_context_set_pid(broker->pre_context, pid);
}
static void __scls_prepare_cb(screen_connector_launcher_service_image_h image,
{
frame_broker_h broker = user_data;
frame_context_h context = broker->context;
+ uint32_t ctx_serial = 0;
_D("[__SCLS__] Stop");
if (context == NULL) {
}
}
+ frame_context_get_serial(context, &ctx_serial);
+ if (ctx_serial != serial) {
+ _W("Skip! serial(%u:%u)", ctx_serial, serial);
+ return;
+ }
+
_D("Destroy context");
frame_context_destroy(context);
+ broker->context = NULL;
}
static frame_context_error_e __convert_error(
frame_context_h context = broker->context;
frame_direction_e direction;
frame_h frame;
+ uint32_t ctx_serial;
int ret;
_D("[__SCLS__] Clean up");
return;
}
+ frame_context_get_serial(context, &ctx_serial);
+ if (ctx_serial != serial) {
+ _W("Skip! serial(%u:%u)", ctx_serial, serial);
+ return;
+ }
+
frame_context_on_pause(context);
ret = frame_context_get_frame(context, &frame);
frame == NULL) {
_D("Destroy context");
frame_context_destroy(context);
+ broker->context = NULL;
}
}
frame_context_h context = broker->context;
_W("[__SCLS__] Reset");
+ if (context == NULL)
+ return;
+
frame_context_set_frame(context, NULL);
}
if (handle->context)
frame_context_destroy(handle->context);
+ if (handle->pre_context)
+ frame_context_destroy(handle->pre_context);
+
screen_connector_launcher_service_destroy(handle->scls);
aul_launcher_service_destroy(handle->als);
free(handle->name);
{
int ret;
- if (!handle || !app_id || pid < -1 || !serial) {
+ if (!handle || !app_id || pid < -1 || !serial) {
_E("Invalid parameter");
return FRAME_BROKER_ERROR_INVALID_PARAMETER;
}