evas/cserve2: Some more code to requests management.
authorantognolli <antognolli@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Thu, 31 May 2012 21:34:09 +0000 (21:34 +0000)
committerantognolli <antognolli@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Thu, 31 May 2012 21:34:09 +0000 (21:34 +0000)
Added code to slave read and slave dead callbacks.

git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/evas@71603 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/bin/evas_cserve2.h
src/bin/evas_cserve2_requests.c

index 23bad59..b1bee41 100644 (file)
@@ -116,7 +116,7 @@ typedef struct _Slave_Msg_Image_Load Slave_Msg_Image_Load;
 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);
 
index 33cef9a..7b86208 100644 (file)
@@ -15,6 +15,7 @@ typedef enum
 
 struct _Slave_Worker
 {
+   Slave_Type type;
    void *data;
    Slave *slave;
    Eina_Binbuf *ret;
@@ -189,13 +190,56 @@ cserve2_requests_shutdown(void)
 }
 
 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 *
@@ -207,8 +251,8 @@ _create_image_slave(void *data)
    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;
 }
@@ -237,6 +281,7 @@ _slave_for_request_create(Slave_Type type)
      }
 
    sw->slave = slave;
+   sw->type = type;
    _workers[type].idle = eina_list_append(_workers[type].idle, sw);
 
    return sw;
@@ -262,21 +307,6 @@ _cserve2_request_dispatch(Slave_Worker *sw, Slave_Command ctype, Font_Request *r
    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)
 {