summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Philippe Andre <jp.andre@samsung.com>2013-10-11 15:36:11 +0900
committerCedric Bail <cedric.bail@free.fr>2013-10-17 20:49:23 +0900
commit20d4ecc95c134ac60c929b268ea4f98a26229e37 (patch)
tree7e67672306c8be4e771854df1b75c995ae70d6f8
parent48f7ced065ccdad7eca7a77ca0f39df0eb652e51 (diff)
downloadefl-20d4ecc95c134ac60c929b268ea4f98a26229e37.tar.gz
evas/cserve2: Add debug and reduce number of GLYPHS_USED messages
One socket message was sent per each glyph used ... which means a LOT of messages when text is being redrawn. Reduce this flow of messages by triggering send() only when 50+ items are being used. Btw, USED is a bit useless as there is no UNUSED equivalent. Also, slightly improve debug logs.
-rw-r--r--src/bin/evas/evas_cserve2_main.c8
-rw-r--r--src/lib/evas/cserve2/evas_cs2_client.c74
2 files changed, 50 insertions, 32 deletions
diff --git a/src/bin/evas/evas_cserve2_main.c b/src/bin/evas/evas_cserve2_main.c
index eedbe51bea..05def93c9c 100644
--- a/src/bin/evas/evas_cserve2_main.c
+++ b/src/bin/evas/evas_cserve2_main.c
@@ -230,8 +230,8 @@ _cserve2_client_font_glyphs_request(Client *client)
if (msg->base.type == CSERVE2_FONT_GLYPHS_LOAD)
{
- INF("Received CSERVE2_FONT_GLYPHS_LOAD command: RID=%d",
- msg->base.rid);
+ INF("Received CSERVE2_FONT_GLYPHS_LOAD command: RID=%d (%d glyphs)",
+ msg->base.rid, msg->nglyphs);
cserve2_cache_font_glyphs_load(client, source, fontpath,
msg->hint, msg->rend_flags, msg->size,
msg->dpi, glyphs, msg->nglyphs,
@@ -239,8 +239,8 @@ _cserve2_client_font_glyphs_request(Client *client)
}
else
{
- INF("Received CSERVE2_FONT_GLYPHS_USED command: RID=%d",
- msg->base.rid);
+ INF("Received CSERVE2_FONT_GLYPHS_USED command: RID=%d (%d glyphs)",
+ msg->base.rid, msg->nglyphs);
cserve2_cache_font_glyphs_used(client, source, fontpath,
msg->hint, msg->rend_flags, msg->size,
msg->dpi, glyphs, msg->nglyphs,
diff --git a/src/lib/evas/cserve2/evas_cs2_client.c b/src/lib/evas/cserve2/evas_cs2_client.c
index 520c4002ea..c052c279e5 100644
--- a/src/lib/evas/cserve2/evas_cs2_client.c
+++ b/src/lib/evas/cserve2/evas_cs2_client.c
@@ -364,45 +364,58 @@ on_error:
}
static Eina_Bool
-_server_send(void *buf, int size, Op_Callback cb, void *data)
+_request_answer_required(int type, Eina_Bool *valid)
{
- Msg_Base *msg;
- if (!_server_safe_send(socketfd, &size, sizeof(size)))
- {
- ERR("Couldn't send message size to server.");
- goto on_error;
- }
- if (!_server_safe_send(socketfd, buf, size))
- {
- ERR("Couldn't send message body to server.");
- goto on_error;
- }
-
- msg = buf;
- switch (msg->type)
+ switch (type)
{
case CSERVE2_OPEN:
case CSERVE2_LOAD:
case CSERVE2_PRELOAD:
case CSERVE2_FONT_LOAD:
case CSERVE2_FONT_GLYPHS_LOAD:
- _request_answer_add(msg, size, cb, data);
- break;
+ if (valid) *valid = EINA_TRUE;
+ return EINA_TRUE;
case CSERVE2_CLOSE:
case CSERVE2_UNLOAD:
case CSERVE2_FONT_UNLOAD:
case CSERVE2_FONT_GLYPHS_USED:
- free(msg);
- break;
+ if (valid) *valid = EINA_TRUE;
+ return EINA_FALSE;
default:
- ERR("Invalid message type %d", msg->type);
- free(msg);
+ ERR("Invalid message type %d", type);
+ if (valid) *valid = EINA_FALSE;
return EINA_FALSE;
}
+}
- return EINA_TRUE;
+static Eina_Bool
+_server_send(void *buf, int size, Op_Callback cb, void *data)
+{
+ Msg_Base *msg = buf;
+ int type = msg->type;
+ Eina_Bool valid = EINA_TRUE;
+
+ if (!_server_safe_send(socketfd, &size, sizeof(size)))
+ {
+ ERR("Couldn't send message size to server.");
+ goto on_error;
+ }
+ if (!_server_safe_send(socketfd, buf, size))
+ {
+ ERR("Couldn't send message body to server.");
+ goto on_error;
+ }
+
+ if (_request_answer_required(type, &valid))
+ _request_answer_add(msg, size, cb, data);
+ else
+ free(msg);
+
+ return valid;
on_error:
+ if (!_request_answer_required(type, NULL))
+ return EINA_FALSE;
ERR("Socket error: %d %m", errno);
switch (errno)
{
@@ -532,6 +545,7 @@ _server_dispatch(Eina_Bool *failed)
Eina_List *l, *l_next;
Client_Request *cr;
Msg_Base *msg;
+ Eina_Bool found;
msg = _server_read(&size);
if (!msg)
@@ -560,6 +574,7 @@ _server_dispatch(Eina_Bool *failed)
if (cr->msg->rid != msg->rid) // dispatch this answer
continue;
+ found = EINA_TRUE;
if (cr->cb)
remove = cr->cb(cr->data, msg, size);
if (remove)
@@ -571,8 +586,10 @@ _server_dispatch(Eina_Bool *failed)
}
rid = msg->rid;
- free(msg);
+ if (!found)
+ WRN("Got unexpected response %d for request %d", msg->type, rid);
+ free(msg);
return rid;
}
@@ -1786,6 +1803,7 @@ _glyph_map_remap_check(Glyph_Map *map, const char *idxpath, const char *datapath
return changed;
}
+#if USE_SHARED_INDEX
static int
_font_entry_glyph_map_rebuild_check(Font_Entry *fe, Font_Hint_Flags hints)
{
@@ -1862,6 +1880,7 @@ _font_entry_glyph_map_rebuild_check(Font_Entry *fe, Font_Hint_Flags hints)
return cnt;
}
+#endif
static Eina_Bool
_glyph_request_cb(void *data, const void *msg, int size)
@@ -1907,6 +1926,7 @@ _glyph_request_cb(void *data, const void *msg, int size)
free(data);
return EINA_TRUE;
}
+ // Keep this request in the list for now
return EINA_FALSE;
}
free(data);
@@ -2166,7 +2186,7 @@ evas_cserve2_font_glyph_request(Font_Entry *fe, unsigned int idx, Font_Hint_Flag
}
/* FIXME crude way to manage a queue, but it will work for now */
- if (fe->glyphs_queue_count == 50)
+ if (fe->glyphs_queue_count >= 50)
_glyph_request_server_send(fe, hints, EINA_FALSE);
return EINA_TRUE;
@@ -2240,7 +2260,7 @@ evas_cserve2_font_glyph_bitmap_get(Font_Entry *fe, unsigned int idx,
if (fe->glyphs_queue_count)
_glyph_request_server_send(fe, hints, EINA_FALSE);
- if (fe->glyphs_used_count)
+ if (fe->glyphs_used_count >= 50)
_glyph_request_server_send(fe, hints, EINA_TRUE);
fash = fe->fash[hints];
@@ -2279,9 +2299,7 @@ try_again:
#if USE_SHARED_INDEX
- // FIXME/TODO: Reimplement the following function.
- // This is probably not the best point to call it, though.
- //_font_entry_glyph_map_rebuild_check(fe, hints);
+ _font_entry_glyph_map_rebuild_check(fe, hints);
#endif
if (out->rid)