summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packaging/data-provider-master.spec2
-rw-r--r--src/server.c290
2 files changed, 252 insertions, 40 deletions
diff --git a/packaging/data-provider-master.spec b/packaging/data-provider-master.spec
index 5066422..eb2c57c 100644
--- a/packaging/data-provider-master.spec
+++ b/packaging/data-provider-master.spec
@@ -1,6 +1,6 @@
Name: data-provider-master
Summary: Master service provider for liveboxes.
-Version: 0.24.18
+Version: 0.24.19
Release: 1
Group: HomeTF/Livebox
License: Flora License
diff --git a/src/server.c b/src/server.c
index e0a4ea8..596c514 100644
--- a/src/server.c
+++ b/src/server.c
@@ -98,6 +98,94 @@ static Eina_Bool lazy_access_status_cb(void *data)
return ECORE_CALLBACK_CANCEL;
}
+static int slave_fault_open_script_cb(struct slave_node *slave, void *data)
+{
+ Ecore_Timer *timer;
+
+ (void)script_handler_unload(instance_pd_script(data), 1);
+ (void)instance_slave_close_pd(data, instance_pd_owner(data));
+ (void)instance_client_pd_created(data, LB_STATUS_ERROR_FAULT);
+
+ timer = instance_del_data(data, "lazy,pd,open");
+ if (timer) {
+ ecore_timer_del(timer);
+ }
+
+ (void)instance_unref(data);
+
+ return -1; /* remove this handler */
+}
+
+static int slave_fault_open_buffer_cb(struct slave_node *slave, void *data)
+{
+ Ecore_Timer *timer;
+
+ (void)instance_slave_close_pd(data, instance_pd_owner(data));
+ (void)instance_client_pd_created(data, LB_STATUS_ERROR_FAULT);
+
+ timer = instance_del_data(data, "pd,open,monitor");
+ if (timer) {
+ ecore_timer_del(timer);
+ }
+
+ (void)instance_unref(data);
+
+ return -1; /* remove this handler */
+}
+
+static int slave_fault_close_script_cb(struct slave_node *slave, void *data)
+{
+ Ecore_Timer *timer;
+
+ (void)instance_client_pd_destroyed(data, LB_STATUS_ERROR_FAULT);
+
+ timer = instance_del_data(data, "lazy,pd,close");
+ if (timer) {
+ ecore_timer_del(timer);
+ }
+
+ (void)instance_unref(data);
+
+ return -1; /* remove this handler */
+}
+
+static int slave_fault_close_buffer_cb(struct slave_node *slave, void *data)
+{
+ Ecore_Timer *timer;
+
+ (void)instance_client_pd_destroyed(data, LB_STATUS_ERROR_FAULT);
+
+ timer = instance_del_data(data, "lazy,pd,close");
+ if (!timer) {
+ timer = instance_del_data(data, "pd,close,monitor");
+ }
+
+ if (timer) {
+ ecore_timer_del(timer);
+ }
+
+ (void)instance_unref(data);
+
+ return -1; /* remove this handler */
+}
+
+static int slave_fault_resize_buffer_cb(struct slave_node *slave, void *data)
+{
+ Ecore_Timer *timer;
+
+ (void)instance_slave_close_pd(data, instance_pd_owner(data));
+ (void)instance_client_pd_destroyed(data, LB_STATUS_ERROR_FAULT);
+
+ timer = instance_del_data(data, "pd,resize,monitor");
+ if (timer) {
+ ecore_timer_del(timer);
+ }
+
+ (void)instance_unref(data);
+
+ return -1; /* remove this handler */
+}
+
static int event_lb_route_cb(enum event_state state, struct event_data *event_info, void *data)
{
struct inst_info *inst = data;
@@ -480,15 +568,13 @@ static Eina_Bool lazy_delete_cb(void *data)
{
struct deleted_item *item = data;
- DbgPrint("Send delete event to the client\n");
-
/*!
* Before invoke this callback, the instance is able to already remove this client
* So check it again
*/
if (instance_has_client(item->inst, item->client)) {
- instance_unicast_deleted_event(item->inst, item->client);
- instance_del_client(item->inst, item->client);
+ (void)instance_unicast_deleted_event(item->inst, item->client);
+ (void)instance_del_client(item->inst, item->client);
}
(void)client_unref(item->client);
@@ -4563,33 +4649,66 @@ out:
return result;
}
-static Eina_Bool lazy_pd_created_cb(void *data)
+static Eina_Bool lazy_pd_created_cb(void *inst)
{
- if (!!instance_del_data(data, "lazy,pd,open")) {
- /*!
- * After unref instance first,
- * if the instance is not destroyed, try to notify the created PD event to the client.
- */
- if (instance_unref(data)) {
- int ret;
- ret = instance_client_pd_created(data, LB_STATUS_SUCCESS);
- DbgPrint("Send PD Create event (%d) to client\n", ret);
+ struct pkg_info *pkg;
+
+ if (!instance_del_data(inst, "lazy,pd,open")) {
+ ErrPrint("lazy,pd,open is already deleted.\n");
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ pkg = instance_package(inst);
+ if (pkg) {
+ struct slave_node *slave;
+
+ slave = package_slave(pkg);
+ if (slave) {
+ slave_event_callback_del(slave, SLAVE_EVENT_DEACTIVATE, slave_fault_open_script_cb, inst);
}
}
+ /*!
+ * After unref instance first,
+ * if the instance is not destroyed, try to notify the created PD event to the client.
+ */
+ if (instance_unref(inst)) {
+ int ret;
+ ret = instance_client_pd_created(inst, LB_STATUS_SUCCESS);
+ DbgPrint("Send PD Create event (%d) to client\n", ret);
+ }
+
return ECORE_CALLBACK_CANCEL;
}
-static Eina_Bool lazy_pd_destroyed_cb(void *data)
+static Eina_Bool lazy_pd_destroyed_cb(void *inst)
{
- if (!!instance_del_data(data, "lazy,pd,close")) {
- if (instance_unref(data)) {
- int ret;
- ret = instance_client_pd_destroyed(data, LB_STATUS_SUCCESS);
- DbgPrint("Send PD Destroy event (%d) to client\n", ret);
+ struct pkg_info *pkg;
+ struct slave_node *slave;
+
+ if (!instance_del_data(inst, "lazy,pd,close")) {
+ ErrPrint("lazy,pd,close is already deleted.\n");
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ pkg = instance_package(inst);
+ if (pkg) {
+ slave = package_slave(pkg);
+ if (slave) {
+ if (package_pd_type(pkg) == PD_TYPE_SCRIPT) {
+ slave_event_callback_del(slave, SLAVE_EVENT_DEACTIVATE, slave_fault_close_script_cb, inst);
+ } else if (package_pd_type(pkg) == PD_TYPE_BUFFER) {
+ slave_event_callback_del(slave, SLAVE_EVENT_DEACTIVATE, slave_fault_close_buffer_cb, inst);
+ }
}
}
+ if (instance_unref(inst)) {
+ int ret;
+ ret = instance_client_pd_destroyed(inst, LB_STATUS_SUCCESS);
+ DbgPrint("Send PD Destroy event (%d) to client\n", ret);
+ }
+
return ECORE_CALLBACK_CANCEL;
}
@@ -4643,10 +4762,20 @@ out:
return NULL;
}
-static Eina_Bool pd_open_monitor_cb(void *data)
+static Eina_Bool pd_open_monitor_cb(void *inst)
{
int ret;
- struct inst_info *inst = data;
+ struct pkg_info *pkg;
+
+ pkg = instance_package(inst);
+ if (pkg) {
+ struct slave_node *slave;
+
+ slave = package_slave(pkg);
+ if (slave) {
+ slave_event_callback_del(slave, SLAVE_EVENT_DEACTIVATE, slave_fault_open_buffer_cb, inst);
+ }
+ }
ret = instance_slave_close_pd(inst, instance_pd_owner(inst));
ret = instance_client_pd_created(inst, LB_STATUS_ERROR_TIMEOUT);
@@ -4656,21 +4785,41 @@ static Eina_Bool pd_open_monitor_cb(void *data)
return ECORE_CALLBACK_CANCEL;
}
-static Eina_Bool pd_close_monitor_cb(void *data)
+static Eina_Bool pd_close_monitor_cb(void *inst)
{
int ret;
+ struct pkg_info *pkg;
- ret = instance_client_pd_destroyed(data, LB_STATUS_ERROR_TIMEOUT);
- (void)instance_del_data(data, "pd,close,monitor");
- (void)instance_unref(data);
+ pkg = instance_package(inst);
+ if (pkg) {
+ struct slave_node *slave;
+
+ slave = package_slave(pkg);
+ if (slave) {
+ slave_event_callback_del(slave, SLAVE_EVENT_DEACTIVATE, slave_fault_close_buffer_cb, inst);
+ }
+ }
+
+ ret = instance_client_pd_destroyed(inst, LB_STATUS_ERROR_TIMEOUT);
+ (void)instance_del_data(inst, "pd,close,monitor");
+ (void)instance_unref(inst);
ErrPrint("PD Close request is not processed in %lf seconds (%d)\n", PD_REQUEST_TIMEOUT, ret);
return ECORE_CALLBACK_CANCEL;
}
-static Eina_Bool pd_resize_monitor_cb(void *data)
+static Eina_Bool pd_resize_monitor_cb(void *inst)
{
int ret;
- struct inst_info *inst = data;
+ struct pkg_info *pkg;
+
+ pkg = instance_package(inst);
+ if (pkg) {
+ struct slave_node *slave;
+ slave = package_slave(pkg);
+ if (slave) {
+ slave_event_callback_del(slave, SLAVE_EVENT_DEACTIVATE, slave_fault_resize_buffer_cb, inst);
+ }
+ }
ret = instance_slave_close_pd(inst, instance_pd_owner(inst));
ret = instance_client_pd_destroyed(inst, LB_STATUS_ERROR_TIMEOUT);
@@ -4688,6 +4837,8 @@ static struct packet *client_create_pd(pid_t pid, int handle, const struct packe
const char *id;
int ret;
struct inst_info *inst;
+ const struct pkg_info *pkg;
+ Ecore_Timer *pd_monitor;
double x;
double y;
@@ -4707,7 +4858,7 @@ static struct packet *client_create_pd(pid_t pid, int handle, const struct packe
goto out;
}
- ret = validate_request(pkgname, id, &inst, NULL);
+ ret = validate_request(pkgname, id, &inst, &pkg);
if (ret != LB_STATUS_SUCCESS)
goto out;
@@ -4715,7 +4866,12 @@ static struct packet *client_create_pd(pid_t pid, int handle, const struct packe
ErrPrint("PD is already owned\n");
ret = LB_STATUS_ERROR_ALREADY;
} else if (package_pd_type(instance_package(inst)) == PD_TYPE_BUFFER) {
- lazy_pd_destroyed_cb(inst);
+ pd_monitor = instance_get_data(inst, "lazy,pd,close");
+ if (pd_monitor) {
+ ecore_timer_del(pd_monitor);
+ /* This timer attribute will be deleted */
+ lazy_pd_destroyed_cb(inst);
+ }
if (instance_get_data(inst, "pd,open,monitor")) {
DbgPrint("PD Open request is already processed\n");
@@ -4750,14 +4906,24 @@ static struct packet *client_create_pd(pid_t pid, int handle, const struct packe
tmp_ret = instance_slave_close_pd(inst, client);
ErrPrint("Unable to send script event for openning PD [%s], %d\n", pkgname, tmp_ret);
} else {
- Ecore_Timer *pd_monitor;
-
pd_monitor = ecore_timer_add(PD_REQUEST_TIMEOUT, pd_open_monitor_cb, instance_ref(inst));
if (!pd_monitor) {
(void)instance_unref(inst);
ErrPrint("Failed to create a timer for PD Open monitor\n");
} else {
+ struct slave_node *slave;
+
(void)instance_set_data(inst, "pd,open,monitor", pd_monitor);
+
+ slave = package_slave(pkg);
+ if (!slave) {
+ ErrPrint("Failed to get slave(%s)\n", pkgname);
+ goto out;
+ }
+
+ if (slave_event_callback_add(slave, SLAVE_EVENT_DEACTIVATE, slave_fault_open_buffer_cb, inst) != LB_STATUS_SUCCESS) {
+ ErrPrint("Failed to add fault handler: %s\n");
+ }
}
}
} else {
@@ -4776,7 +4942,12 @@ static struct packet *client_create_pd(pid_t pid, int handle, const struct packe
int ix;
int iy;
- lazy_pd_destroyed_cb(inst);
+ pd_monitor = instance_get_data(inst, "lazy,pd,close");
+ if (pd_monitor) {
+ ecore_timer_del(pd_monitor);
+ /* lazy,pd,close will be deleted */
+ lazy_pd_destroyed_cb(inst);
+ }
/*!
* \note
@@ -4802,7 +4973,6 @@ static struct packet *client_create_pd(pid_t pid, int handle, const struct packe
* Send the PD created event to the clients,
*/
if (ret == LB_STATUS_SUCCESS) {
- Ecore_Timer *timer;
/*!
* \note
@@ -4824,8 +4994,8 @@ static struct packet *client_create_pd(pid_t pid, int handle, const struct packe
* But I just add it to the tagged-data of the instance.
* Just reserve for future-use.
*/
- timer = ecore_timer_add(DELAY_TIME, lazy_pd_created_cb, inst);
- if (!timer) {
+ pd_monitor = ecore_timer_add(DELAY_TIME, lazy_pd_created_cb, inst);
+ if (!pd_monitor) {
struct inst_info *tmp_inst;
tmp_inst = instance_unref(inst);
@@ -4839,7 +5009,19 @@ static struct packet *client_create_pd(pid_t pid, int handle, const struct packe
ret = LB_STATUS_ERROR_FAULT;
} else {
- (void)instance_set_data(inst, "lazy,pd,open", timer);
+ struct slave_node *slave;
+
+ (void)instance_set_data(inst, "lazy,pd,open", pd_monitor);
+
+ slave = package_slave(pkg);
+ if (!slave) {
+ ErrPrint("Failed to get slave: %s\n", pkgname);
+ goto out;
+ }
+
+ if (slave_event_callback_add(slave, SLAVE_EVENT_DEACTIVATE, slave_fault_open_script_cb, inst) != LB_STATUS_SUCCESS) {
+ ErrPrint("Failed to add fault callback: %s\n", pkgname);
+ }
}
} else {
int tmp_ret;
@@ -4872,6 +5054,7 @@ static struct packet *client_destroy_pd(pid_t pid, int handle, const struct pack
struct inst_info *inst;
const struct pkg_info *pkg;
Ecore_Timer *pd_monitor;
+ struct slave_node *slave;
DbgPrint("PERF_DBOX\n");
@@ -4893,6 +5076,12 @@ static struct packet *client_destroy_pd(pid_t pid, int handle, const struct pack
if (ret != LB_STATUS_SUCCESS)
goto out;
+ slave = package_slave(pkg);
+ if (!slave) {
+ ret = LB_STATUS_ERROR_INVALID;
+ goto out;
+ }
+
if (instance_pd_owner(inst) != client) {
if (instance_pd_owner(inst) == NULL) {
ErrPrint("PD looks already closed\n");
@@ -4906,8 +5095,11 @@ static struct packet *client_destroy_pd(pid_t pid, int handle, const struct pack
pd_monitor = instance_del_data(inst, "pd,open,monitor");
if (pd_monitor) {
+
ErrPrint("PD Open request is found. cancel it [%s]\n", pkgname);
+ slave_event_callback_del(slave, SLAVE_EVENT_DEACTIVATE, slave_fault_open_buffer_cb, inst);
+
/*!
* \note
* We should return negative value
@@ -4946,6 +5138,8 @@ static struct packet *client_destroy_pd(pid_t pid, int handle, const struct pack
pd_monitor = instance_del_data(inst, "pd,resize,monitor");
if (pd_monitor) {
ErrPrint("PD Resize request is found. clear it [%s]\n", pkgname);
+ slave_event_callback_del(slave, SLAVE_EVENT_DEACTIVATE, slave_fault_resize_buffer_cb, inst);
+
ecore_timer_del(pd_monitor);
inst = instance_unref(inst);
@@ -4969,6 +5163,7 @@ static struct packet *client_destroy_pd(pid_t pid, int handle, const struct pack
(void)instance_unref(inst);
} else {
(void)instance_set_data(inst, "lazy,pd,close", pd_monitor);
+ slave_event_callback_add(slave, SLAVE_EVENT_DEACTIVATE, slave_fault_close_buffer_cb, inst);
}
} else {
pd_monitor = ecore_timer_add(PD_REQUEST_TIMEOUT, pd_close_monitor_cb, instance_ref(inst));
@@ -4977,6 +5172,7 @@ static struct packet *client_destroy_pd(pid_t pid, int handle, const struct pack
ErrPrint("Failed to add pd close monitor\n");
} else {
(void)instance_set_data(inst, "pd,close,monitor", pd_monitor);
+ slave_event_callback_add(slave, SLAVE_EVENT_DEACTIVATE, slave_fault_close_buffer_cb, inst);
}
}
/*!
@@ -4987,7 +5183,11 @@ static struct packet *client_destroy_pd(pid_t pid, int handle, const struct pack
* instance_client_pd_destroyed(inst);
*/
} else if (package_pd_type(pkg) == PD_TYPE_SCRIPT) {
- lazy_pd_created_cb(inst);
+ pd_monitor = instance_get_data(inst, "lazy,pd,open");
+ if (pd_monitor) {
+ ecore_timer_del(pd_monitor);
+ lazy_pd_created_cb(inst);
+ }
ret = script_handler_unload(instance_pd_script(inst), 1);
if (ret < 0)
@@ -5020,6 +5220,7 @@ static struct packet *client_destroy_pd(pid_t pid, int handle, const struct pack
(void)instance_unref(inst);
} else {
(void)instance_set_data(inst, "lazy,pd,close", pd_monitor);
+ slave_event_callback_add(slave, SLAVE_EVENT_DEACTIVATE, slave_fault_close_script_cb, inst);
}
}
} else {
@@ -6035,8 +6236,14 @@ static struct packet *slave_acquire_buffer(pid_t pid, int handle, const struct p
if (!pd_monitor) {
pd_monitor = instance_del_data(inst, "pd,resize,monitor");
is_resize = !!pd_monitor;
- if (!is_resize)
+ if (!is_resize) {
+ /* Invalid request. Reject this */
goto out;
+ }
+
+ slave_event_callback_del(slave, SLAVE_EVENT_DEACTIVATE, slave_fault_resize_buffer_cb, inst);
+ } else {
+ slave_event_callback_del(slave, SLAVE_EVENT_DEACTIVATE, slave_fault_open_buffer_cb, inst);
}
ecore_timer_del(pd_monitor);
@@ -6258,9 +6465,14 @@ static struct packet *slave_release_buffer(pid_t pid, int handle, const struct p
ErrPrint("Failed to create a timer for PD Open monitor\n");
} else {
(void)instance_set_data(inst, "pd,resize,monitor", pd_monitor);
+ if (slave_event_callback_add(slave, SLAVE_EVENT_DEACTIVATE, slave_fault_resize_buffer_cb, inst) != LB_STATUS_SUCCESS) {
+ ErrPrint("Failed to add event handler: %s\n", pkgname);
+ }
}
}
} else {
+ slave_event_callback_del(slave, SLAVE_EVENT_DEACTIVATE, slave_fault_close_buffer_cb, inst);
+
ecore_timer_del(pd_monitor);
inst = instance_unref(inst);
if (!inst) {