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.
This commit is contained in:
Jean-Philippe Andre 2013-10-11 15:36:11 +09:00
parent 4c44b5a553
commit 7b62d77cf5
2 changed files with 51 additions and 33 deletions

View File

@ -234,8 +234,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,
@ -243,8 +243,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,

View File

@ -363,10 +363,38 @@ on_error:
return EINA_FALSE;
}
static Eina_Bool
_request_answer_required(int type, Eina_Bool *valid)
{
switch (type)
{
case CSERVE2_OPEN:
case CSERVE2_LOAD:
case CSERVE2_PRELOAD:
case CSERVE2_FONT_LOAD:
case CSERVE2_FONT_GLYPHS_LOAD:
if (valid) *valid = EINA_TRUE;
return EINA_TRUE;
case CSERVE2_CLOSE:
case CSERVE2_UNLOAD:
case CSERVE2_FONT_UNLOAD:
case CSERVE2_FONT_GLYPHS_USED:
if (valid) *valid = EINA_TRUE;
return EINA_FALSE;
default:
ERR("Invalid message type %d", type);
if (valid) *valid = EINA_FALSE;
return EINA_FALSE;
}
}
static Eina_Bool
_server_send(void *buf, int size, Op_Callback cb, void *data)
{
Msg_Base *msg;
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.");
@ -378,31 +406,16 @@ _server_send(void *buf, int size, Op_Callback cb, void *data)
goto on_error;
}
msg = buf;
switch (msg->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;
case CSERVE2_CLOSE:
case CSERVE2_UNLOAD:
case CSERVE2_FONT_UNLOAD:
case CSERVE2_FONT_GLYPHS_USED:
free(msg);
break;
default:
ERR("Invalid message type %d", msg->type);
free(msg);
return EINA_FALSE;
}
if (_request_answer_required(type, &valid))
_request_answer_add(msg, size, cb, data);
else
free(msg);
return EINA_TRUE;
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)