From db6cba1429624968cf7f9bc49a508d2bb5d0b23f Mon Sep 17 00:00:00 2001 From: Jean-Philippe Andre Date: Wed, 26 Jun 2013 17:47:41 +0900 Subject: [PATCH] evas/cserve2: avoid useless SETOPT messages. Most of the time, the SETOPT message is sent only to carry 0 data. Let's add a flag to the OPEN message to avoid useless socket calls. Server-side: implement with message faking. Also, fix image ID logic on client side: - alloc data entry asap, - assign image_id during call to OPEN Signed-off-by: Cedric Bail --- src/bin/evas/evas_cserve2_main.c | 17 ++++++- src/lib/evas/cserve2/evas_cs2.h | 3 ++ src/lib/evas/cserve2/evas_cs2_client.c | 70 ++++++++++++++++++++------ 3 files changed, 74 insertions(+), 16 deletions(-) diff --git a/src/bin/evas/evas_cserve2_main.c b/src/bin/evas/evas_cserve2_main.c index 5d88c4e083..ad71d81e0b 100644 --- a/src/bin/evas/evas_cserve2_main.c +++ b/src/bin/evas/evas_cserve2_main.c @@ -130,9 +130,24 @@ _cserve2_client_open(Client *client) key = ((const char *)msg) + sizeof(*msg) + msg->key_offset; INF("Received OPEN command: RID=%d", msg->base.rid); - INF("File_ID: %d, path=\"%s\", key=\"%s\"", msg->file_id, path, key); + INF("File_ID: %d, path=\"%s\", key=\"%s\", has_load_opts=%d", + msg->file_id, path, key, (int) msg->has_load_opts); cserve2_cache_file_open(client, msg->file_id, path, key, msg->base.rid); + + if (!msg->has_load_opts) + { + /* FIXME: We should remove this fake call to setopts and do the + * appropriate work instead. (split functions) */ + Msg_Setopts optsmsg; + + memset(&optsmsg, 0, sizeof(optsmsg)); + optsmsg.base.rid = msg->base.rid; + optsmsg.base.type = CSERVE2_SETOPTS; + optsmsg.file_id = msg->file_id; + optsmsg.image_id = msg->image_id; + cserve2_cache_image_opts_set(client, &optsmsg); + } } static void diff --git a/src/lib/evas/cserve2/evas_cs2.h b/src/lib/evas/cserve2/evas_cs2.h index 7bd4c51f4d..9b38c75784 100644 --- a/src/lib/evas/cserve2/evas_cs2.h +++ b/src/lib/evas/cserve2/evas_cs2.h @@ -54,6 +54,9 @@ struct _Msg_Open { unsigned int file_id; int path_offset; int key_offset; + unsigned int image_id; + + Eina_Bool has_load_opts : 1; }; struct _Msg_Opened { diff --git a/src/lib/evas/cserve2/evas_cs2_client.c b/src/lib/evas/cserve2/evas_cs2_client.c index 404b5224f3..30845501f5 100644 --- a/src/lib/evas/cserve2/evas_cs2_client.c +++ b/src/lib/evas/cserve2/evas_cs2_client.c @@ -46,6 +46,25 @@ static Eina_List *_requests = NULL; #define UNIX_PATH_MAX sizeof(((struct sockaddr_un *)NULL)->sun_path) #endif +static inline Eina_Bool +_memory_zero_cmp(void *data, size_t len) +{ + const int *idata = data; + const char *cdata; + int remain; + + if (!data || !len) return EINA_TRUE; + + for (remain = len / sizeof(idata); remain > 0; --remain) + if (*idata++ != 0) return EINA_FALSE; + + cdata = (const char*) idata; + for (remain = ((const char*) data + len) - cdata; remain > 0; --remain) + if (*cdata++ != 0) return EINA_FALSE; + + return EINA_TRUE; +} + static void _socket_path_set(char *path) { @@ -585,7 +604,7 @@ _build_absolute_path(const char *path, char buf[], int size) } static unsigned int -_image_open_server_send(Image_Entry *ie, const char *file, const char *key, Evas_Image_Load_Opts *lopt EINA_UNUSED) +_image_open_server_send(Image_Entry *ie, const char *file, const char *key, Eina_Bool has_load_opts) { int flen, klen; int size; @@ -593,6 +612,7 @@ _image_open_server_send(Image_Entry *ie, const char *file, const char *key, Evas char filebuf[PATH_MAX]; Msg_Open msg_open; File_Entry *fentry; + Data_Entry *dentry; if (cserve2_init == 0) { @@ -600,6 +620,9 @@ _image_open_server_send(Image_Entry *ie, const char *file, const char *key, Evas return 0; } + ie->data1 = NULL; + ie->data2 = NULL; + flen = _build_absolute_path(file, filebuf, sizeof(filebuf)); if (!flen) { @@ -611,6 +634,16 @@ _image_open_server_send(Image_Entry *ie, const char *file, const char *key, Evas if (!key) key = ""; fentry = calloc(1, sizeof(*fentry)); + if (!fentry) + return 0; + + dentry = calloc(1, sizeof(*dentry)); + if (!dentry) + { + free(fentry); + return 0; + } + memset(&msg_open, 0, sizeof(msg_open)); @@ -622,10 +655,17 @@ _image_open_server_send(Image_Entry *ie, const char *file, const char *key, Evas msg_open.file_id = fentry->file_id; msg_open.path_offset = 0; msg_open.key_offset = flen; + msg_open.has_load_opts = has_load_opts; + msg_open.image_id = ++_data_id; size = sizeof(msg_open) + flen + klen; buf = malloc(size); - if (!buf) return EINA_FALSE; + if (!buf) + { + free(fentry); + free(dentry); + return 0; + } memcpy(buf, &msg_open, sizeof(msg_open)); memcpy(buf + sizeof(msg_open), filebuf, flen); memcpy(buf + sizeof(msg_open) + flen, key, klen); @@ -635,35 +675,33 @@ _image_open_server_send(Image_Entry *ie, const char *file, const char *key, Evas ERR("Couldn't send message to server."); free(buf); free(fentry); + free(dentry); return 0; } free(buf); ie->data1 = fentry; + dentry->image_id = msg_open.image_id; + ie->data2 = dentry; + return msg_open.base.rid; } static unsigned int _image_setopts_server_send(Image_Entry *ie) { - File_Entry *fentry; - Data_Entry *dentry; + File_Entry *fentry = ie->data1; + Data_Entry *dentry = ie->data2; Msg_Setopts msg; if (cserve2_init == 0) return 0; - fentry = ie->data1; - - dentry = calloc(1, sizeof(*dentry)); - if (!dentry) + if (!fentry || !dentry) return 0; memset(&msg, 0, sizeof(msg)); - dentry->image_id = ++_data_id; - if (dentry->image_id == 0) - dentry->image_id = ++_data_id; msg.base.rid = _next_rid(); msg.base.type = CSERVE2_SETOPTS; @@ -691,11 +729,10 @@ _image_setopts_server_send(Image_Entry *ie) if (!_server_send(&msg, sizeof(msg), NULL, NULL)) { free(dentry); + ie->data2 = NULL; return 0; } - ie->data2 = dentry; - return msg.base.rid; } @@ -840,17 +877,20 @@ Eina_Bool evas_cserve2_image_load(Image_Entry *ie, const char *file, const char *key, Evas_Image_Load_Opts *lopt) { unsigned int rid; + Eina_Bool has_load_opts; if (!ie) return EINA_FALSE; - rid = _image_open_server_send(ie, file, key, lopt); + has_load_opts = !_memory_zero_cmp(lopt, sizeof(*lopt)); + rid = _image_open_server_send(ie, file, key, has_load_opts); if (!rid) return EINA_FALSE; ie->open_rid = rid; - _image_setopts_server_send(ie); + if (has_load_opts) + _image_setopts_server_send(ie); // _server_dispatch_until(rid);