forked from enlightenment/efl
evas/cserve2: Merge Glyph_Data and mempool index
Glyphs were previously using 3 shared buffers, now reduce to 2: - Memory pool (mempool) containing the glyph drawable data - Index table (Shared_Index / array) containing only the indexes of the buffers in the mempool - Glyph_Data table (array) containing the glyphs descriptors AS WELL as the buffer indexes. So, we just merge the two index tables into one by using directly objects of type Glyph_Data for the referencing of the mempool buffers.
This commit is contained in:
parent
7b62d77cf5
commit
1513007815
|
@ -381,7 +381,7 @@ void *cserve2_shared_array_item_data_find(Shared_Array *sa, void *data,
|
||||||
int cserve2_shared_array_foreach(Shared_Array *sa, Eina_Each_Cb cb, void *data);
|
int cserve2_shared_array_foreach(Shared_Array *sa, Eina_Each_Cb cb, void *data);
|
||||||
|
|
||||||
// Shared buffers and memory pools
|
// Shared buffers and memory pools
|
||||||
Shared_Mempool *cserve2_shared_mempool_new(int indextag, int generation_id, int initsize);
|
Shared_Mempool *cserve2_shared_mempool_new(int indextag, int index_elemsize, int generation_id, int initsize);
|
||||||
void cserve2_shared_mempool_del(Shared_Mempool *sm);
|
void cserve2_shared_mempool_del(Shared_Mempool *sm);
|
||||||
int cserve2_shared_mempool_buffer_new(Shared_Mempool *sm, int size);
|
int cserve2_shared_mempool_buffer_new(Shared_Mempool *sm, int size);
|
||||||
int cserve2_shared_mempool_buffer_ref(Shared_Mempool *sm, int bufferid);
|
int cserve2_shared_mempool_buffer_ref(Shared_Mempool *sm, int bufferid);
|
||||||
|
@ -392,6 +392,7 @@ size_t cserve2_shared_mempool_size_get(Shared_Mempool *sm);
|
||||||
const char *cserve2_shared_mempool_name_get(Shared_Mempool *sm);
|
const char *cserve2_shared_mempool_name_get(Shared_Mempool *sm);
|
||||||
int cserve2_shared_mempool_generation_id_get(Shared_Mempool *sm);
|
int cserve2_shared_mempool_generation_id_get(Shared_Mempool *sm);
|
||||||
int cserve2_shared_mempool_generation_id_set(Shared_Mempool *sm, int generation_id);
|
int cserve2_shared_mempool_generation_id_set(Shared_Mempool *sm, int generation_id);
|
||||||
|
Shared_Array *cserve2_shared_mempool_index_get(Shared_Mempool *sm);
|
||||||
|
|
||||||
// Shared strings
|
// Shared strings
|
||||||
const char *cserve2_shared_strings_table_name_get();
|
const char *cserve2_shared_strings_table_name_get();
|
||||||
|
|
|
@ -90,7 +90,6 @@ struct _Font_Entry {
|
||||||
Font_Source *src;
|
Font_Source *src;
|
||||||
void *ft; // Font_Info
|
void *ft; // Font_Info
|
||||||
Fash_Glyph2 *glyph_entries[3]; // Fast access to the Glyph_Entry objects
|
Fash_Glyph2 *glyph_entries[3]; // Fast access to the Glyph_Entry objects
|
||||||
Shared_Array *glyph_datas; // Contains the Glyph_Data objects
|
|
||||||
unsigned int nglyphs;
|
unsigned int nglyphs;
|
||||||
Eina_Bool unused : 1;
|
Eina_Bool unused : 1;
|
||||||
Shared_Mempool *mempool; // Contains the rendered glyphs
|
Shared_Mempool *mempool; // Contains the rendered glyphs
|
||||||
|
@ -139,7 +138,6 @@ struct _File_Watch {
|
||||||
|
|
||||||
static unsigned int _generation_id = 0;
|
static unsigned int _generation_id = 0;
|
||||||
static unsigned int _entry_id = 0;
|
static unsigned int _entry_id = 0;
|
||||||
static unsigned int _glyph_id = 0;
|
|
||||||
static unsigned int _font_data_id = 0;
|
static unsigned int _font_data_id = 0;
|
||||||
static unsigned int _freed_file_entry_count = 0;
|
static unsigned int _freed_file_entry_count = 0;
|
||||||
static unsigned int _freed_image_entry_count = 0;
|
static unsigned int _freed_image_entry_count = 0;
|
||||||
|
@ -318,10 +316,12 @@ _font_data_find(unsigned int fs_id)
|
||||||
}
|
}
|
||||||
|
|
||||||
static Glyph_Data *
|
static Glyph_Data *
|
||||||
_glyph_data_find(Shared_Array *sa, unsigned int glyph_id)
|
_glyph_data_find(Shared_Mempool *sm, unsigned int glyph_id)
|
||||||
{
|
{
|
||||||
Glyph_Data *gldata;
|
Glyph_Data *gldata;
|
||||||
|
Shared_Array *sa;
|
||||||
|
|
||||||
|
sa = cserve2_shared_mempool_index_get(sm);
|
||||||
gldata = cserve2_shared_array_item_data_find(sa, &glyph_id,
|
gldata = cserve2_shared_array_item_data_find(sa, &glyph_id,
|
||||||
_shm_object_id_cmp_cb);
|
_shm_object_id_cmp_cb);
|
||||||
if (!gldata)
|
if (!gldata)
|
||||||
|
@ -1214,14 +1214,13 @@ _font_entry_key_hash(const Font_Entry *key, int key_length EINA_UNUSED)
|
||||||
static int
|
static int
|
||||||
_font_entry_memory_usage_get(Font_Entry *fe)
|
_font_entry_memory_usage_get(Font_Entry *fe)
|
||||||
{
|
{
|
||||||
int size;
|
int size = sizeof(Font_Entry);
|
||||||
|
|
||||||
if (!fe) return 0;
|
if (!fe) return 0;
|
||||||
if (!fe->mempool && !fe->glyph_datas)
|
if (!fe->mempool)
|
||||||
return 0;
|
return size;
|
||||||
|
|
||||||
size = cserve2_shared_mempool_size_get(fe->mempool);
|
size += cserve2_shared_mempool_size_get(fe->mempool);
|
||||||
size += cserve2_shared_array_map_size_get(fe->glyph_datas);
|
|
||||||
size += fe->nglyphs * sizeof(Glyph_Entry);
|
size += fe->nglyphs * sizeof(Glyph_Entry);
|
||||||
|
|
||||||
return size;
|
return size;
|
||||||
|
@ -1251,7 +1250,6 @@ _font_entry_free(Font_Entry *fe)
|
||||||
|
|
||||||
for (k = 0; k < 3; k++)
|
for (k = 0; k < 3; k++)
|
||||||
fash_gl_free(fe->glyph_entries[k]);
|
fash_gl_free(fe->glyph_entries[k]);
|
||||||
cserve2_shared_array_del(fe->glyph_datas);
|
|
||||||
cserve2_shared_mempool_del(fe->mempool);
|
cserve2_shared_mempool_del(fe->mempool);
|
||||||
cserve2_font_ft_free(fe->ft);
|
cserve2_font_ft_free(fe->ft);
|
||||||
fe->src->refcount--;
|
fe->src->refcount--;
|
||||||
|
@ -1274,10 +1272,10 @@ _glyph_free_cb(void *data)
|
||||||
|
|
||||||
if (!gl || !gl->fe) return;
|
if (!gl || !gl->fe) return;
|
||||||
|
|
||||||
gldata = _glyph_data_find(gl->fe->glyph_datas, gl->gldata_id);
|
gldata = _glyph_data_find(gl->fe->mempool, gl->gldata_id);
|
||||||
if (gldata)
|
if (gldata)
|
||||||
{
|
{
|
||||||
cserve2_shared_string_del(gldata->shm_id);
|
cserve2_shared_string_del(gldata->mempool_id);
|
||||||
gldata->refcount--;
|
gldata->refcount--;
|
||||||
}
|
}
|
||||||
free(gl);
|
free(gl);
|
||||||
|
@ -1864,6 +1862,7 @@ static Msg_Font_Glyphs_Loaded *
|
||||||
_glyphs_loaded_msg_create(Glyphs_Request *req, int *resp_size)
|
_glyphs_loaded_msg_create(Glyphs_Request *req, int *resp_size)
|
||||||
{
|
{
|
||||||
Msg_Font_Glyphs_Loaded *msg;
|
Msg_Font_Glyphs_Loaded *msg;
|
||||||
|
Shared_Array *sa;
|
||||||
unsigned int size;
|
unsigned int size;
|
||||||
const char *shmname, *idxname;
|
const char *shmname, *idxname;
|
||||||
unsigned int shmname_size, idxname_size;
|
unsigned int shmname_size, idxname_size;
|
||||||
|
@ -1871,9 +1870,12 @@ _glyphs_loaded_msg_create(Glyphs_Request *req, int *resp_size)
|
||||||
char *response, *buf;
|
char *response, *buf;
|
||||||
|
|
||||||
shmname = cserve2_shared_mempool_name_get(req->fe->mempool);
|
shmname = cserve2_shared_mempool_name_get(req->fe->mempool);
|
||||||
|
if (!shmname) return NULL;
|
||||||
shmname_size = strlen(shmname) + 1;
|
shmname_size = strlen(shmname) + 1;
|
||||||
|
|
||||||
idxname = cserve2_shared_array_name_get(req->fe->glyph_datas);
|
sa = cserve2_shared_mempool_index_get(req->fe->mempool);
|
||||||
|
idxname = cserve2_shared_array_name_get(sa);
|
||||||
|
if (!idxname) return NULL;
|
||||||
idxname_size = strlen(idxname) + 1;
|
idxname_size = strlen(idxname) + 1;
|
||||||
|
|
||||||
size = sizeof(Msg_Font_Glyphs_Loaded);
|
size = sizeof(Msg_Font_Glyphs_Loaded);
|
||||||
|
@ -1904,7 +1906,7 @@ _glyphs_loaded_msg_create(Glyphs_Request *req, int *resp_size)
|
||||||
Glyph_Data *gldata;
|
Glyph_Data *gldata;
|
||||||
|
|
||||||
ge = req->answer[k];
|
ge = req->answer[k];
|
||||||
gldata = _glyph_data_find(ge->fe->glyph_datas, ge->gldata_id);
|
gldata = _glyph_data_find(ge->fe->mempool, ge->gldata_id);
|
||||||
if (!gldata)
|
if (!gldata)
|
||||||
{
|
{
|
||||||
ERR("Glyph data not found for %d", ge->gldata_id);
|
ERR("Glyph data not found for %d", ge->gldata_id);
|
||||||
|
@ -1913,7 +1915,7 @@ _glyphs_loaded_msg_create(Glyphs_Request *req, int *resp_size)
|
||||||
|
|
||||||
memcpy(buf, &gldata->index, sizeof(int));
|
memcpy(buf, &gldata->index, sizeof(int));
|
||||||
buf += sizeof(int);
|
buf += sizeof(int);
|
||||||
memcpy(buf, &gldata->shm_id, sizeof(string_t));
|
memcpy(buf, &gldata->mempool_id, sizeof(string_t));
|
||||||
buf += sizeof(string_t);
|
buf += sizeof(string_t);
|
||||||
memcpy(buf, &gldata->offset, sizeof(int));
|
memcpy(buf, &gldata->offset, sizeof(int));
|
||||||
buf += sizeof(int);
|
buf += sizeof(int);
|
||||||
|
@ -2112,8 +2114,9 @@ _glyphs_load_request_response(Glyphs_Request *req,
|
||||||
{
|
{
|
||||||
Font_Entry *fe = req->fe;
|
Font_Entry *fe = req->fe;
|
||||||
Shared_Mempool *mempool = msg->mempool;
|
Shared_Mempool *mempool = msg->mempool;
|
||||||
|
Shared_Array *index;
|
||||||
unsigned int j, hint;
|
unsigned int j, hint;
|
||||||
string_t shm_id = 0;
|
string_t shm_id;
|
||||||
Font_Data *fd;
|
Font_Data *fd;
|
||||||
|
|
||||||
if (!msg->nglyphs)
|
if (!msg->nglyphs)
|
||||||
|
@ -2131,14 +2134,12 @@ _glyphs_load_request_response(Glyphs_Request *req,
|
||||||
DBG("Font memory usage [begin]: %d / %d", font_mem_usage, max_font_usage);
|
DBG("Font memory usage [begin]: %d / %d", font_mem_usage, max_font_usage);
|
||||||
|
|
||||||
cserve2_shared_mempool_generation_id_set(mempool, _generation_id);
|
cserve2_shared_mempool_generation_id_set(mempool, _generation_id);
|
||||||
if (!fe->glyph_datas)
|
index = cserve2_shared_mempool_index_get(mempool);
|
||||||
|
|
||||||
|
if (!fd->glyph_index_shm)
|
||||||
{
|
{
|
||||||
fe->glyph_datas = cserve2_shared_array_new(GLYPH_INDEX_ARRAY_TAG,
|
fd->glyph_index_shm = cserve2_shared_string_add
|
||||||
_generation_id,
|
(cserve2_shared_array_name_get(index));
|
||||||
sizeof(Glyph_Data), 0);
|
|
||||||
font_mem_usage += cserve2_shared_array_map_size_get(fe->glyph_datas);
|
|
||||||
fd->glyph_index_shm = cserve2_shared_string_add(
|
|
||||||
cserve2_shared_array_name_get(fe->glyph_datas));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
shm_id = cserve2_shared_string_add(cserve2_shared_mempool_name_get(mempool));
|
shm_id = cserve2_shared_string_add(cserve2_shared_mempool_name_get(mempool));
|
||||||
|
@ -2149,31 +2150,23 @@ _glyphs_load_request_response(Glyphs_Request *req,
|
||||||
gl = fash_gl_find(fe->glyph_entries[hint], msg->glyphs[j].index);
|
gl = fash_gl_find(fe->glyph_entries[hint], msg->glyphs[j].index);
|
||||||
if (!gl)
|
if (!gl)
|
||||||
{
|
{
|
||||||
int glyph_id, orig_mapsize, new_mapsize;
|
|
||||||
Glyph_Data *gldata;
|
Glyph_Data *gldata;
|
||||||
|
|
||||||
orig_mapsize = cserve2_shared_array_map_size_get(fe->glyph_datas);
|
gldata = _glyph_data_find(mempool, msg->glyphs[j].buffer_id);
|
||||||
|
|
||||||
glyph_id = cserve2_shared_array_item_new(fe->glyph_datas);
|
|
||||||
gldata = cserve2_shared_array_item_data_get(fe->glyph_datas,
|
|
||||||
glyph_id);
|
|
||||||
if (!gldata)
|
if (!gldata)
|
||||||
{
|
{
|
||||||
ERR("Could not create new Glyph_Data!");
|
ERR("Could not find Glyph_Data %d", msg->glyphs[j].buffer_id);
|
||||||
// TODO: Return error?
|
// TODO: Return error?
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
gl = calloc(1, sizeof(*gl));
|
gl = calloc(1, sizeof(*gl));
|
||||||
gl->fe = fe;
|
gl->fe = fe;
|
||||||
gl->gldata_id = ++_glyph_id;
|
gl->gldata_id = gldata->id;
|
||||||
|
|
||||||
gldata->refcount = 1;
|
gldata->mempool_id = cserve2_shared_string_ref(shm_id);
|
||||||
gldata->id = gl->gldata_id;
|
|
||||||
gldata->index = msg->glyphs[j].index;
|
gldata->index = msg->glyphs[j].index;
|
||||||
gldata->shm_id = cserve2_shared_string_ref(shm_id);
|
gldata->offset = msg->glyphs[j].offset;
|
||||||
gldata->buffer_id = msg->glyphs[j].buffer_id;
|
|
||||||
gldata->offset = msg->glyphs[j].offset; // TODO: Remove?
|
|
||||||
gldata->size = msg->glyphs[j].size;
|
gldata->size = msg->glyphs[j].size;
|
||||||
gldata->rows = msg->glyphs[j].rows;
|
gldata->rows = msg->glyphs[j].rows;
|
||||||
gldata->width = msg->glyphs[j].width;
|
gldata->width = msg->glyphs[j].width;
|
||||||
|
@ -2185,13 +2178,10 @@ _glyphs_load_request_response(Glyphs_Request *req,
|
||||||
fe->nglyphs++;
|
fe->nglyphs++;
|
||||||
fash_gl_add(fe->glyph_entries[hint], gldata->index, gl);
|
fash_gl_add(fe->glyph_entries[hint], gldata->index, gl);
|
||||||
|
|
||||||
new_mapsize = cserve2_shared_array_map_size_get(fe->glyph_datas);
|
|
||||||
font_mem_usage += new_mapsize - orig_mapsize;
|
|
||||||
font_mem_usage += sizeof(*gl);
|
font_mem_usage += sizeof(*gl);
|
||||||
}
|
}
|
||||||
req->answer[req->nanswer++] = gl;
|
req->answer[req->nanswer++] = gl;
|
||||||
}
|
}
|
||||||
|
|
||||||
cserve2_shared_string_del(shm_id);
|
cserve2_shared_string_del(shm_id);
|
||||||
|
|
||||||
#ifdef DEBUG_LOAD_TIME
|
#ifdef DEBUG_LOAD_TIME
|
||||||
|
@ -2243,6 +2233,7 @@ _font_entry_stats_cb(const Eina_Hash *hash EINA_UNUSED,
|
||||||
Font_Entry *fe = data;
|
Font_Entry *fe = data;
|
||||||
Msg_Stats *msg = fdata;
|
Msg_Stats *msg = fdata;
|
||||||
unsigned int shmsize;
|
unsigned int shmsize;
|
||||||
|
Shared_Array *sa;
|
||||||
|
|
||||||
msg->fonts.fonts_loaded++;
|
msg->fonts.fonts_loaded++;
|
||||||
if (fe->unused) msg->fonts.fonts_unused++;
|
if (fe->unused) msg->fonts.fonts_unused++;
|
||||||
|
@ -2252,8 +2243,12 @@ _font_entry_stats_cb(const Eina_Hash *hash EINA_UNUSED,
|
||||||
msg->fonts.real_size += shmsize;
|
msg->fonts.real_size += shmsize;
|
||||||
if (fe->unused) msg->fonts.unused_size += shmsize;
|
if (fe->unused) msg->fonts.unused_size += shmsize;
|
||||||
|
|
||||||
cserve2_shared_array_foreach(fe->glyph_datas,
|
sa = cserve2_shared_mempool_index_get(fe->mempool);
|
||||||
EINA_EACH_CB(_font_requested_size_cb), msg);
|
if (sa)
|
||||||
|
{
|
||||||
|
cserve2_shared_array_foreach
|
||||||
|
(sa, EINA_EACH_CB(_font_requested_size_cb), msg);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_LOAD_TIME
|
#ifdef DEBUG_LOAD_TIME
|
||||||
// accounting fonts load time
|
// accounting fonts load time
|
||||||
|
@ -2409,6 +2404,7 @@ _font_entry_debug_cb(const Eina_Hash *hash EINA_UNUSED,
|
||||||
unsigned int len, k, nglyphs;
|
unsigned int len, k, nglyphs;
|
||||||
const char *str;
|
const char *str;
|
||||||
char *nglyphs_pos;
|
char *nglyphs_pos;
|
||||||
|
Shared_Array *index = NULL;
|
||||||
|
|
||||||
// file
|
// file
|
||||||
str = cserve2_shared_string_get(fe->src->file);
|
str = cserve2_shared_string_get(fe->src->file);
|
||||||
|
@ -2449,32 +2445,37 @@ _font_entry_debug_cb(const Eina_Hash *hash EINA_UNUSED,
|
||||||
buf += sizeof(int);
|
buf += sizeof(int);
|
||||||
|
|
||||||
// glyph shared index and mempool
|
// glyph shared index and mempool
|
||||||
if (fe->glyph_datas)
|
|
||||||
eina_strlcpy(buf, cserve2_shared_array_name_get(fe->glyph_datas), 64);
|
|
||||||
else
|
|
||||||
memset(buf, 0, 64);
|
|
||||||
buf += 64;
|
|
||||||
|
|
||||||
if (fe->mempool)
|
if (fe->mempool)
|
||||||
|
{
|
||||||
|
index = cserve2_shared_mempool_index_get(fe->mempool);
|
||||||
eina_strlcpy(buf, cserve2_shared_mempool_name_get(fe->mempool), 64);
|
eina_strlcpy(buf, cserve2_shared_mempool_name_get(fe->mempool), 64);
|
||||||
else
|
|
||||||
memset(buf, 0, 64);
|
|
||||||
buf += 64;
|
buf += 64;
|
||||||
|
eina_strlcpy(buf, cserve2_shared_array_name_get(index), 64);
|
||||||
|
buf += 64;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memset(buf, 0, 128);
|
||||||
|
buf += 128;
|
||||||
|
}
|
||||||
|
|
||||||
// skip nglyphs for now...
|
// skip nglyphs for now...
|
||||||
nglyphs_pos = buf;
|
nglyphs_pos = buf;
|
||||||
buf += sizeof(int);
|
buf += sizeof(int);
|
||||||
|
|
||||||
nglyphs = 0;
|
nglyphs = 0;
|
||||||
|
if (index)
|
||||||
|
{
|
||||||
for (k = 0; k < fe->nglyphs; k++)
|
for (k = 0; k < fe->nglyphs; k++)
|
||||||
{
|
{
|
||||||
Glyph_Data *gd = cserve2_shared_array_item_data_get(fe->glyph_datas, k);
|
Glyph_Data *gd = cserve2_shared_array_item_data_get(index, k);
|
||||||
if (!gd || !gd->id) break;
|
if (!gd || !gd->id) break;
|
||||||
|
|
||||||
nglyphs++;
|
nglyphs++;
|
||||||
memcpy(buf, gd, sizeof(*gd));
|
memcpy(buf, gd, sizeof(*gd));
|
||||||
buf += sizeof(*gd);
|
buf += sizeof(*gd);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// write real value of nglyphs
|
// write real value of nglyphs
|
||||||
memcpy(nglyphs_pos, &nglyphs, sizeof(int));
|
memcpy(nglyphs_pos, &nglyphs, sizeof(int));
|
||||||
|
|
|
@ -365,9 +365,15 @@ _font_slave_glyph_render(Font_Info *fi, Slave_Msg_Font_Glyphs_Loaded *response,
|
||||||
return EINA_TRUE;
|
return EINA_TRUE;
|
||||||
|
|
||||||
on_error:
|
on_error:
|
||||||
// Create invalid entry for this index.
|
// Create invalid entry for this index. There will be an empty slot in
|
||||||
|
// the mempool (usually 8 bytes) because we need the Glyph_Data index entry.
|
||||||
|
ERR("Could not load glyph %d. Creating empty invalid entry.", idx);
|
||||||
memset(&response->glyphs[response->nglyphs], 0, sizeof(Slave_Msg_Glyph));
|
memset(&response->glyphs[response->nglyphs], 0, sizeof(Slave_Msg_Glyph));
|
||||||
|
if (buffer_id > 0)
|
||||||
|
cserve2_shared_mempool_buffer_del(response->mempool, buffer_id);
|
||||||
|
buffer_id = cserve2_shared_mempool_buffer_new(response->mempool, 1);
|
||||||
response->glyphs[response->nglyphs].index = idx;
|
response->glyphs[response->nglyphs].index = idx;
|
||||||
|
response->glyphs[response->nglyphs].buffer_id = buffer_id;
|
||||||
response->nglyphs++;
|
response->nglyphs++;
|
||||||
return EINA_FALSE;
|
return EINA_FALSE;
|
||||||
}
|
}
|
||||||
|
@ -480,7 +486,8 @@ _font_slave_glyphs_load(const void *cmddata, void *data EINA_UNUSED)
|
||||||
{
|
{
|
||||||
unsigned shmsize = _font_slave_int_shm_calculate(fi, msg->font.hint);
|
unsigned shmsize = _font_slave_int_shm_calculate(fi, msg->font.hint);
|
||||||
response->mempool = cserve2_shared_mempool_new(GLYPH_DATA_ARRAY_TAG,
|
response->mempool = cserve2_shared_mempool_new(GLYPH_DATA_ARRAY_TAG,
|
||||||
0, shmsize);
|
sizeof(Glyph_Data), 0,
|
||||||
|
shmsize);
|
||||||
if (!response->mempool) return NULL;
|
if (!response->mempool) return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -593,15 +593,20 @@ _shared_index_entry_get_by_id(Shared_Index *si, unsigned int id)
|
||||||
}
|
}
|
||||||
|
|
||||||
static Shared_Index *
|
static Shared_Index *
|
||||||
_shared_index_new(int tag, int generation_id)
|
_shared_index_new(int tag, int index_elemsize, int generation_id)
|
||||||
{
|
{
|
||||||
Shared_Index *si;
|
Shared_Index *si;
|
||||||
Index_Entry *ie;
|
Index_Entry *ie;
|
||||||
|
|
||||||
|
EINA_SAFETY_ON_FALSE_RETURN_VAL(index_elemsize >= 0, NULL);
|
||||||
|
|
||||||
si = calloc(1, sizeof(Shared_Index));
|
si = calloc(1, sizeof(Shared_Index));
|
||||||
if (!si) return NULL;
|
if (!si) return NULL;
|
||||||
|
|
||||||
si->sa = cserve2_shared_array_new(tag, generation_id, sizeof(Index_Entry), 0);
|
if (!index_elemsize)
|
||||||
|
index_elemsize = sizeof(Index_Entry);
|
||||||
|
|
||||||
|
si->sa = cserve2_shared_array_new(tag, generation_id, index_elemsize, 0);
|
||||||
if (!si->sa)
|
if (!si->sa)
|
||||||
{
|
{
|
||||||
free(si);
|
free(si);
|
||||||
|
@ -632,12 +637,14 @@ _shared_index_del(Shared_Index *si)
|
||||||
// Shared memory pool
|
// Shared memory pool
|
||||||
|
|
||||||
Shared_Mempool *
|
Shared_Mempool *
|
||||||
cserve2_shared_mempool_new(int indextag, int generation_id, int initsize)
|
cserve2_shared_mempool_new(int indextag, int index_elemsize,
|
||||||
|
int generation_id, int initsize)
|
||||||
{
|
{
|
||||||
Shared_Mempool *sm;
|
Shared_Mempool *sm;
|
||||||
size_t mapping_size;
|
size_t mapping_size;
|
||||||
|
|
||||||
if (initsize < 0) return NULL;
|
EINA_SAFETY_ON_FALSE_RETURN_VAL(initsize >= 0, NULL);
|
||||||
|
EINA_SAFETY_ON_FALSE_RETURN_VAL(index_elemsize >= 0, NULL);
|
||||||
|
|
||||||
sm = calloc(1, sizeof(Shared_Mempool));
|
sm = calloc(1, sizeof(Shared_Mempool));
|
||||||
if (!sm) return NULL;
|
if (!sm) return NULL;
|
||||||
|
@ -652,7 +659,7 @@ cserve2_shared_mempool_new(int indextag, int generation_id, int initsize)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
sm->index = _shared_index_new(indextag, generation_id);
|
sm->index = _shared_index_new(indextag, index_elemsize, generation_id);
|
||||||
if (!sm->index)
|
if (!sm->index)
|
||||||
{
|
{
|
||||||
_shared_data_shm_del(sm->ds);
|
_shared_data_shm_del(sm->ds);
|
||||||
|
@ -664,6 +671,13 @@ cserve2_shared_mempool_new(int indextag, int generation_id, int initsize)
|
||||||
return sm;
|
return sm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Shared_Array *
|
||||||
|
cserve2_shared_mempool_index_get(Shared_Mempool *sm)
|
||||||
|
{
|
||||||
|
EINA_SAFETY_ON_NULL_RETURN_VAL(sm, NULL);
|
||||||
|
return sm->index->sa;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_shared_mempool_block_del(Eina_Rbtree *node, void *data EINA_UNUSED)
|
_shared_mempool_block_del(Eina_Rbtree *node, void *data EINA_UNUSED)
|
||||||
{
|
{
|
||||||
|
@ -1043,7 +1057,7 @@ cserve2_shared_index_init(void)
|
||||||
int ifaketag = STRING_MEMPOOL_FAKETAG;
|
int ifaketag = STRING_MEMPOOL_FAKETAG;
|
||||||
|
|
||||||
DBG("Initializing shared index");
|
DBG("Initializing shared index");
|
||||||
_string_mempool = cserve2_shared_mempool_new(STRING_INDEX_ARRAY_TAG, 0, 0);
|
_string_mempool = cserve2_shared_mempool_new(STRING_INDEX_ARRAY_TAG, 0, 0, 0);
|
||||||
_string_entries = eina_hash_string_djb2_new(NULL);
|
_string_entries = eina_hash_string_djb2_new(NULL);
|
||||||
|
|
||||||
memcpy(faketag, &ifaketag, sizeof(int));
|
memcpy(faketag, &ifaketag, sizeof(int));
|
||||||
|
|
|
@ -152,11 +152,6 @@ _shm_file_probe(Shm_File *sf)
|
||||||
sf_fonts = sf;
|
sf_fonts = sf;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GLYPH_INDEX_ARRAY_TAG:
|
|
||||||
DBG("Found index table with tag '%4.4s'", (char *) &sf->header->tag);
|
|
||||||
sf->tag = sf->header->tag;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GLYPH_DATA_ARRAY_TAG:
|
case GLYPH_DATA_ARRAY_TAG:
|
||||||
DBG("Found index table with tag '%4.4s'", (char *) &sf->header->tag);
|
DBG("Found index table with tag '%4.4s'", (char *) &sf->header->tag);
|
||||||
sf->tag = sf->header->tag;
|
sf->tag = sf->header->tag;
|
||||||
|
@ -647,7 +642,7 @@ _glyphs_all_print(Shm_File *sf)
|
||||||
printf(" %8u %6u %6u %5u %5u %5u %5u %5u %1u %1u %6u %6u '%s'\n",
|
printf(" %8u %6u %6u %5u %5u %5u %5u %5u %1u %1u %6u %6u '%s'\n",
|
||||||
gd->id, gd->refcount, gd->index, gd->size, gd->rows, gd->width,
|
gd->id, gd->refcount, gd->index, gd->size, gd->rows, gd->width,
|
||||||
gd->pitch, gd->num_grays, gd->hint, gd->pixel_mode, gd->buffer_id,
|
gd->pitch, gd->num_grays, gd->hint, gd->pixel_mode, gd->buffer_id,
|
||||||
gd->offset, _shared_string_get(gd->shm_id));
|
gd->offset, _shared_string_get(gd->mempool_id));
|
||||||
|
|
||||||
nglyphs++;
|
nglyphs++;
|
||||||
mem_used += gd->size;
|
mem_used += gd->size;
|
||||||
|
|
|
@ -379,14 +379,17 @@ struct _Font_Data {
|
||||||
uint32_t dpi;
|
uint32_t dpi;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define GLYPH_INDEX_ARRAY_TAG ('G' | 'L' << 8 | 'I' << 16 | 'D' << 24)
|
|
||||||
#define GLYPH_DATA_ARRAY_TAG ('G' | 'L' << 8 | 'P' << 16 | 'H' << 24)
|
#define GLYPH_DATA_ARRAY_TAG ('G' | 'L' << 8 | 'P' << 16 | 'H' << 24)
|
||||||
struct _Glyph_Data {
|
struct _Glyph_Data {
|
||||||
|
// Index_Entry
|
||||||
SHMOBJECT;
|
SHMOBJECT;
|
||||||
|
int32_t length;
|
||||||
|
int32_t offset;
|
||||||
|
int32_t shmid;
|
||||||
|
// Glyph data stuff
|
||||||
uint32_t index;
|
uint32_t index;
|
||||||
string_t shm_id;
|
string_t mempool_id; // TODO: Merge with shmid? (Internally impossible atm)
|
||||||
uint32_t buffer_id;
|
uint32_t buffer_id;
|
||||||
uint32_t offset;
|
|
||||||
uint32_t size;
|
uint32_t size;
|
||||||
uint32_t rows;
|
uint32_t rows;
|
||||||
uint32_t width;
|
uint32_t width;
|
||||||
|
|
|
@ -597,9 +597,7 @@ static Eina_Bool
|
||||||
_server_dispatch_until(unsigned int rid)
|
_server_dispatch_until(unsigned int rid)
|
||||||
{
|
{
|
||||||
Eina_Bool failed;
|
Eina_Bool failed;
|
||||||
fd_set rfds;
|
|
||||||
unsigned int rrid;
|
unsigned int rrid;
|
||||||
struct timeval tv;
|
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
|
@ -608,6 +606,8 @@ _server_dispatch_until(unsigned int rid)
|
||||||
#if TIMEOUT
|
#if TIMEOUT
|
||||||
else if (failed)
|
else if (failed)
|
||||||
{
|
{
|
||||||
|
fd_set rfds;
|
||||||
|
struct timeval tv;
|
||||||
int sel;
|
int sel;
|
||||||
|
|
||||||
if (socketfd == -1)
|
if (socketfd == -1)
|
||||||
|
|
Loading…
Reference in New Issue