typedef struct _Slave_Msg_Image_Loaded Slave_Msg_Image_Loaded;
typedef void *(*Font_Request_Msg_Create)(void *data, int *size);
-typedef void *(*Font_Request_Msg_Free)(void *data);
+typedef void (*Font_Request_Msg_Free)(void *data);
typedef void (*Font_Request_Response)(Client *c, void *data, void *resp, unsigned int rid);
typedef void (*Font_Request_Error)(Client *c, void *data, Error_Type error, unsigned int rid);
struct _Slave_Worker
{
+ Slave_Type type;
void *data;
Slave *slave;
Eina_Binbuf *ret;
}
static void
-_image_slave_read_cb(Slave *s __UNUSED__, Slave_Command cmd __UNUSED__, void *msg __UNUSED__, void *data __UNUSED__)
+_cserve2_request_failed(Font_Request *req, Error_Type type)
{
+ Waiter *w;
+
+ EINA_LIST_FREE(req->waiters, w)
+ {
+ req->funcs->error(w->client, req->data, type, w->rid);
+ free(w);
+ }
+
+ req->funcs->msg_free(req->msg);
+ free(req);
}
static void
-_image_slave_dead_cb(Slave *s __UNUSED__, void *data __UNUSED__)
+_slave_read_cb(Slave *s __UNUSED__, Slave_Command cmd __UNUSED__, void *msg, void *data)
{
+ Slave_Worker *sw = data;
+ Font_Request *req = sw->data;
+ Eina_List **working, **idle;
+ Waiter *w;
+
+ EINA_LIST_FREE(req->waiters, w)
+ {
+ req->response(w->client, req->data, msg, w->rid);
+ free(w);
+ }
+
+ req->funcs->msg_free(req->msg);
+ free(req);
+ sw->data = NULL;
+
+ working = &_workers[sw->type].working;
+ idle = &_workers[sw->type].idle;
+ *working = eina_list_remove(*working, sw);
+ *idle = eina_list_append(*idle, sw);
+}
+
+static void
+_slave_dead_cb(Slave *s __UNUSED__, void *data)
+{
+ Slave_Worker *sw = data;
+ Font_Request *req = sw->data;
+ Eina_List **working = &_workers[sw->type].working;
+
+ if (req)
+ _cserve2_request_failed(req, CSERVE2_LOADER_DIED);
+
+ *working = eina_list_remove(*working, sw);
+ free(sw);
}
static Slave *
exe = getenv("EVAS_CSERVE2_SLAVE");
if (!exe) exe = "evas_cserve2_slave";
- slave = cserve2_slave_run(exe, _image_slave_read_cb,
- _image_slave_dead_cb, data);
+ slave = cserve2_slave_run(exe, _slave_read_cb,
+ _slave_dead_cb, data);
return slave;
}
}
sw->slave = slave;
+ sw->type = type;
_workers[type].idle = eina_list_append(_workers[type].idle, sw);
return sw;
return EINA_TRUE;
}
-static void
-_cserve2_request_failed(Font_Request *req, Error_Type type)
-{
- Waiter *w;
-
- EINA_LIST_FREE(req->waiters, w)
- {
- req->funcs->error(w->client, req->data, type, w->rid);
- free(w);
- }
-
- req->funcs->msg_free(req->msg);
- free(req);
-}
-
void
cserve2_requests_process(void)
{