forked from enlightenment/efl
evas/cserve2: Add proper tags to shm arrays
Use tags such as INDX, FONT, IMAG, FILE. These can help debugging and for robustness, as they will be visible in the memory dump. Update generation_id after repack as well
This commit is contained in:
parent
1e4ee656a0
commit
4f5c48236f
|
@ -254,7 +254,7 @@ void cserve2_client_del(Client *client);
|
|||
void cserve2_client_deliver(Client *client);
|
||||
void cserve2_client_error_send(Client *client, unsigned int rid, int error_code);
|
||||
ssize_t cserve2_client_send(Client *client, const void *data, size_t size);
|
||||
void cserve2_index_list_send(const char *strings_index_path, const char *strings_entries_path, const char *files_index_path, const char *images_index_path, const char *fonts_index_path, Client *client);
|
||||
void cserve2_index_list_send(int generation_id, const char *strings_index_path, const char *strings_entries_path, const char *files_index_path, const char *images_index_path, const char *fonts_index_path, Client *client);
|
||||
|
||||
Eina_Bool cserve2_fd_watch_add(int fd, Fd_Flags flags, Fd_Watch_Cb cb, const void *data);
|
||||
Eina_Bool cserve2_fd_watch_del(int fd);
|
||||
|
@ -347,7 +347,7 @@ typedef Eina_Bool (* Shared_Array_Repack_Skip_Cb) (Shared_Array *sa,
|
|||
void *user_data);
|
||||
|
||||
// Shared arrays (arrays of fixed size object)
|
||||
Shared_Array *cserve2_shared_array_new(int tag, int elemsize, int initcount);
|
||||
Shared_Array *cserve2_shared_array_new(int tag, int generation_id, int elemsize, int initcount);
|
||||
const char *cserve2_shared_array_name_get(Shared_Array *sa);
|
||||
void cserve2_shared_array_del(Shared_Array *sa);
|
||||
int cserve2_shared_array_size_get(Shared_Array *sa);
|
||||
|
@ -355,10 +355,11 @@ int cserve2_shared_array_count_get(Shared_Array *sa);
|
|||
int cserve2_shared_array_map_size_get(Shared_Array *sa);
|
||||
int cserve2_shared_array_item_size_get(Shared_Array *sa);
|
||||
int cserve2_shared_array_generation_id_get(Shared_Array *sa);
|
||||
int cserve2_shared_array_generation_id_set(Shared_Array *sa, int generation_id);
|
||||
int cserve2_shared_array_size_set(Shared_Array *sa, int newcount);
|
||||
int cserve2_shared_array_item_new(Shared_Array *sa);
|
||||
void *cserve2_shared_array_item_data_get(Shared_Array *sa, int elemid);
|
||||
Shared_Array *cserve2_shared_array_repack(Shared_Array *sa,
|
||||
Shared_Array *cserve2_shared_array_repack(Shared_Array *sa, int generation_id,
|
||||
Shared_Array_Repack_Skip_Cb skip,
|
||||
Eina_Compare_Cb cmp, void *user_data);
|
||||
int cserve2_shared_array_item_find(Shared_Array *sa, void *data,
|
||||
|
@ -368,7 +369,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);
|
||||
|
||||
// Shared buffers and memory pools
|
||||
Shared_Mempool *cserve2_shared_mempool_new(int initsize);
|
||||
Shared_Mempool *cserve2_shared_mempool_new(int indextag, int generation_id, int initsize);
|
||||
void cserve2_shared_mempool_del(Shared_Mempool *sm);
|
||||
int cserve2_shared_mempool_buffer_new(Shared_Mempool *sm, int size);
|
||||
int cserve2_shared_mempool_buffer_ref(Shared_Mempool *sm, int bufferid);
|
||||
|
@ -377,6 +378,8 @@ void *cserve2_shared_mempool_buffer_get(Shared_Mempool *sm, int bufferid);
|
|||
int cserve2_shared_mempool_buffer_offset_get(Shared_Mempool *sm, int bufferid);
|
||||
size_t cserve2_shared_mempool_size_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_set(Shared_Mempool *sm, int generation_id);
|
||||
|
||||
// Shared strings
|
||||
const char *cserve2_shared_strings_table_name_get();
|
||||
|
|
|
@ -121,6 +121,7 @@ struct _File_Watch {
|
|||
Eina_List *entries;
|
||||
};
|
||||
|
||||
static unsigned int _generation_id = 0;
|
||||
static unsigned int _entry_id = 0;
|
||||
static unsigned int _glyph_id = 0;
|
||||
static unsigned int _font_data_id = 0;
|
||||
|
@ -341,7 +342,9 @@ _repack()
|
|||
DBG("Repacking file data array: %s",
|
||||
cserve2_shared_array_name_get(_file_data_array));
|
||||
|
||||
sa = cserve2_shared_array_repack(_file_data_array,
|
||||
_generation_id++;
|
||||
|
||||
sa = cserve2_shared_array_repack(_file_data_array, _generation_id,
|
||||
_repack_skip_cb,
|
||||
_shm_object_id_cmp_cb, NULL);
|
||||
if (!sa)
|
||||
|
@ -364,7 +367,10 @@ skip_files:
|
|||
DBG("Repacking image data array: %s",
|
||||
cserve2_shared_array_name_get(_image_data_array));
|
||||
|
||||
sa = cserve2_shared_array_repack(_image_data_array,
|
||||
if (!updated)
|
||||
_generation_id++;
|
||||
|
||||
sa = cserve2_shared_array_repack(_image_data_array, _generation_id,
|
||||
_repack_skip_cb,
|
||||
_shm_object_id_cmp_cb, NULL);
|
||||
if (!sa)
|
||||
|
@ -387,7 +393,10 @@ skip_images:
|
|||
DBG("Repacking font data array: %s",
|
||||
cserve2_shared_array_name_get(_font_data_array));
|
||||
|
||||
sa = cserve2_shared_array_repack(_font_data_array,
|
||||
if (!updated)
|
||||
_generation_id++;
|
||||
|
||||
sa = cserve2_shared_array_repack(_font_data_array, _generation_id,
|
||||
_repack_skip_cb,
|
||||
_shm_object_id_cmp_cb, NULL);
|
||||
if (!sa)
|
||||
|
@ -404,12 +413,19 @@ skip_images:
|
|||
skip_fonts:
|
||||
|
||||
if (updated)
|
||||
cserve2_index_list_send(cserve2_shared_strings_index_name_get(),
|
||||
cserve2_shared_strings_table_name_get(),
|
||||
cserve2_shared_array_name_get(_file_data_array),
|
||||
cserve2_shared_array_name_get(_image_data_array),
|
||||
cserve2_shared_array_name_get(_font_data_array),
|
||||
NULL);
|
||||
{
|
||||
// TODO: Update strings table generation_id?
|
||||
cserve2_shared_array_generation_id_set(_font_data_array, _generation_id);
|
||||
cserve2_shared_array_generation_id_set(_image_data_array, _generation_id);
|
||||
cserve2_shared_array_generation_id_set(_file_data_array, _generation_id);
|
||||
cserve2_index_list_send(_generation_id,
|
||||
cserve2_shared_strings_index_name_get(),
|
||||
cserve2_shared_strings_table_name_get(),
|
||||
cserve2_shared_array_name_get(_file_data_array),
|
||||
cserve2_shared_array_name_get(_image_data_array),
|
||||
cserve2_shared_array_name_get(_font_data_array),
|
||||
NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -1224,9 +1240,16 @@ cserve2_cache_init(void)
|
|||
EINA_FREE_CB(_font_entry_free),
|
||||
5);
|
||||
|
||||
_file_data_array = cserve2_shared_array_new(1, sizeof(File_Data), 0);
|
||||
_image_data_array = cserve2_shared_array_new(1, sizeof(Image_Data), 0);
|
||||
_font_data_array = cserve2_shared_array_new(1, sizeof(Font_Data), 0);
|
||||
_generation_id++;
|
||||
_file_data_array = cserve2_shared_array_new(FILE_DATA_ARRAY_TAG,
|
||||
_generation_id,
|
||||
sizeof(File_Data), 0);
|
||||
_image_data_array = cserve2_shared_array_new(IMAGE_DATA_ARRAY_TAG,
|
||||
_generation_id,
|
||||
sizeof(Image_Data), 0);
|
||||
_font_data_array = cserve2_shared_array_new(FONT_DATA_ARRAY_TAG,
|
||||
_generation_id,
|
||||
sizeof(Font_Data), 0);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -1411,7 +1434,8 @@ cserve2_cache_client_new(Client *client)
|
|||
client->images.referencing = eina_hash_int32_new(_entry_free_cb);
|
||||
client->fonts.referencing = NULL;
|
||||
|
||||
cserve2_index_list_send(cserve2_shared_strings_index_name_get(),
|
||||
cserve2_index_list_send(_generation_id,
|
||||
cserve2_shared_strings_index_name_get(),
|
||||
cserve2_shared_strings_table_name_get(),
|
||||
cserve2_shared_array_name_get(_file_data_array),
|
||||
cserve2_shared_array_name_get(_image_data_array),
|
||||
|
@ -1958,13 +1982,18 @@ _glyphs_load_request_response(Glyphs_Request *req,
|
|||
|
||||
if (!mempool)
|
||||
{
|
||||
mempool = cserve2_shared_mempool_new(0);
|
||||
mempool = cserve2_shared_mempool_new(GLYPH_DATA_ARRAY_TAG,
|
||||
_generation_id, 0);
|
||||
font_mem_usage += cserve2_shared_mempool_size_get(mempool);
|
||||
}
|
||||
else
|
||||
cserve2_shared_mempool_generation_id_set(mempool, _generation_id);
|
||||
|
||||
if (!fe->glyph_datas)
|
||||
{
|
||||
fe->glyph_datas = cserve2_shared_array_new(1, sizeof(Glyph_Data), 0);
|
||||
fe->glyph_datas = cserve2_shared_array_new(GLYPH_INDEX_ARRAY_TAG,
|
||||
_generation_id,
|
||||
sizeof(Glyph_Data), 0);
|
||||
font_mem_usage += cserve2_shared_array_map_size_get(fe->glyph_datas);
|
||||
}
|
||||
|
||||
|
|
|
@ -490,7 +490,8 @@ _font_slave_glyphs_load(const void *cmddata, void *data EINA_UNUSED)
|
|||
if (!response->mempool)
|
||||
{
|
||||
unsigned shmsize = _font_slave_int_shm_calculate(fi, msg->font.hint);
|
||||
response->mempool = cserve2_shared_mempool_new(shmsize);
|
||||
response->mempool = cserve2_shared_mempool_new(GLYPH_DATA_ARRAY_TAG,
|
||||
0, shmsize);
|
||||
if (!response->mempool) return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -149,7 +149,7 @@ _block_rbtree_block_find(const Block *node, const void *key,
|
|||
// Data shm
|
||||
|
||||
static Data_Shm *
|
||||
_shared_data_shm_new(int size)
|
||||
_shared_data_shm_new(const char *infix, int size)
|
||||
{
|
||||
Data_Shm *ds;
|
||||
size_t mapping_size;
|
||||
|
@ -162,7 +162,7 @@ _shared_data_shm_new(int size)
|
|||
|
||||
mapping_size = cserve2_shm_size_normalize((size_t) size);
|
||||
|
||||
ds->shm = cserve2_shm_request("data", mapping_size);
|
||||
ds->shm = cserve2_shm_request(infix, mapping_size);
|
||||
if (!ds->shm)
|
||||
{
|
||||
ERR("Could not create shm of size %u", (unsigned) mapping_size);
|
||||
|
@ -228,7 +228,7 @@ _shared_data_shm_resize(Data_Shm *ds, size_t newsize)
|
|||
// Arrays
|
||||
|
||||
Shared_Array *
|
||||
cserve2_shared_array_new(int tag, int elemsize, int initcount)
|
||||
cserve2_shared_array_new(int tag, int generation_id, int elemsize, int initcount)
|
||||
{
|
||||
Shared_Array *sa;
|
||||
Data_Shm *ds;
|
||||
|
@ -243,7 +243,7 @@ cserve2_shared_array_new(int tag, int elemsize, int initcount)
|
|||
if (!initcount) initcount = 1;
|
||||
mapping_size = cserve2_shm_size_normalize(elemsize * initcount
|
||||
+ sizeof(Shared_Array_Header));
|
||||
ds = _shared_data_shm_new(mapping_size);
|
||||
ds = _shared_data_shm_new("array", mapping_size);
|
||||
if (!ds)
|
||||
{
|
||||
free(sa);
|
||||
|
@ -254,7 +254,7 @@ cserve2_shared_array_new(int tag, int elemsize, int initcount)
|
|||
sa->header = (Shared_Array_Header *) ds->data;
|
||||
sa->header->count = (mapping_size - sizeof(Shared_Array_Header)) / elemsize;
|
||||
sa->header->elemsize = elemsize;
|
||||
sa->header->generation_id = 1;
|
||||
sa->header->generation_id = generation_id;
|
||||
sa->header->emptyidx = 0;
|
||||
sa->header->sortedidx = 0;
|
||||
sa->header->tag = tag;
|
||||
|
@ -313,6 +313,16 @@ cserve2_shared_array_generation_id_get(Shared_Array *sa)
|
|||
return sa->header->generation_id;
|
||||
}
|
||||
|
||||
int cserve2_shared_array_generation_id_set(Shared_Array *sa, int generation_id)
|
||||
{
|
||||
if (!sa) return -1;
|
||||
if (sa->header->generation_id == generation_id)
|
||||
return 0;
|
||||
|
||||
sa->header->generation_id = generation_id;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
cserve2_shared_array_size_set(Shared_Array *sa, int newcount)
|
||||
{
|
||||
|
@ -388,7 +398,7 @@ cserve2_shared_array_foreach(Shared_Array *sa, Eina_Each_Cb cb, void *data)
|
|||
}
|
||||
|
||||
Shared_Array *
|
||||
cserve2_shared_array_repack(Shared_Array *sa,
|
||||
cserve2_shared_array_repack(Shared_Array *sa, int generation_id,
|
||||
Shared_Array_Repack_Skip_Cb skip,
|
||||
Eina_Compare_Cb cmp,
|
||||
void *user_data)
|
||||
|
@ -413,13 +423,12 @@ cserve2_shared_array_repack(Shared_Array *sa,
|
|||
}
|
||||
|
||||
// Create new array
|
||||
sa2 = cserve2_shared_array_new(0, elemsize, newcount);
|
||||
sa2 = cserve2_shared_array_new(sa->header->tag, generation_id, elemsize, newcount);
|
||||
if (!sa)
|
||||
{
|
||||
ERR("Can not repack array: failed to create new array");
|
||||
return NULL;
|
||||
}
|
||||
sa2->header->generation_id = sa->header->generation_id + 1;
|
||||
|
||||
// Write data
|
||||
dstdata = sa2->ds->data + sizeof(Shared_Array_Header);
|
||||
|
@ -567,16 +576,15 @@ _shared_index_entry_get_by_id(Shared_Index *si, unsigned int id)
|
|||
}
|
||||
|
||||
static Shared_Index *
|
||||
_shared_index_new()
|
||||
_shared_index_new(int tag, int generation_id)
|
||||
{
|
||||
Shared_Index *si;
|
||||
Index_Entry *ie;
|
||||
int tag = 1234; // FIXME?
|
||||
|
||||
si = calloc(1, sizeof(Shared_Index));
|
||||
if (!si) return NULL;
|
||||
|
||||
si->sa = cserve2_shared_array_new(tag, sizeof(Index_Entry), 1);
|
||||
si->sa = cserve2_shared_array_new(tag, generation_id, sizeof(Index_Entry), 0);
|
||||
if (!si->sa)
|
||||
{
|
||||
free(si);
|
||||
|
@ -607,7 +615,7 @@ _shared_index_del(Shared_Index *si)
|
|||
// Shared memory pool
|
||||
|
||||
Shared_Mempool *
|
||||
cserve2_shared_mempool_new(int initsize)
|
||||
cserve2_shared_mempool_new(int indextag, int generation_id, int initsize)
|
||||
{
|
||||
Shared_Mempool *sm;
|
||||
size_t mapping_size;
|
||||
|
@ -620,14 +628,14 @@ cserve2_shared_mempool_new(int initsize)
|
|||
if (!initsize) initsize = 1;
|
||||
mapping_size = cserve2_shm_size_normalize((size_t) initsize);
|
||||
|
||||
sm->ds = _shared_data_shm_new(mapping_size);
|
||||
sm->ds = _shared_data_shm_new("mempool", mapping_size);
|
||||
if (!sm->ds)
|
||||
{
|
||||
free(sm);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
sm->index = _shared_index_new();
|
||||
sm->index = _shared_index_new(indextag, generation_id);
|
||||
if (!sm->index)
|
||||
{
|
||||
_shared_data_shm_del(sm->ds);
|
||||
|
@ -859,6 +867,24 @@ cserve2_shared_mempool_name_get(Shared_Mempool *sm)
|
|||
return cserve2_shm_name_get(sm->ds->shm);
|
||||
}
|
||||
|
||||
int
|
||||
cserve2_shared_mempool_generation_id_get(Shared_Mempool *sm)
|
||||
{
|
||||
if (!sm) return -1;
|
||||
return sm->index->sa->header->generation_id;
|
||||
}
|
||||
|
||||
int
|
||||
cserve2_shared_mempool_generation_id_set(Shared_Mempool *sm, int generation_id)
|
||||
{
|
||||
if (!sm) return -1;
|
||||
if (sm->index->sa->header->generation_id == generation_id)
|
||||
return 0;
|
||||
|
||||
sm->index->sa->header->generation_id = generation_id;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
// Shared strings
|
||||
|
||||
|
@ -959,9 +985,15 @@ cserve2_shared_index_init(void)
|
|||
{
|
||||
if (!_instances)
|
||||
{
|
||||
char faketag[5] = {0};
|
||||
int ifaketag = STRING_MEMPOOL_FAKETAG;
|
||||
|
||||
DBG("Initializing shared index");
|
||||
_string_mempool = cserve2_shared_mempool_new(4096);
|
||||
_string_mempool = cserve2_shared_mempool_new(STRING_INDEX_ARRAY_TAG, 0, 0);
|
||||
_string_entries = eina_hash_string_djb2_new(NULL);
|
||||
|
||||
memcpy(faketag, &ifaketag, sizeof(int));
|
||||
cserve2_shared_string_add(faketag);
|
||||
}
|
||||
_instances++;
|
||||
}
|
||||
|
|
|
@ -36,7 +36,8 @@ cserve2_client_error_send(Client *client, unsigned int rid, int error_code)
|
|||
}
|
||||
|
||||
void
|
||||
cserve2_index_list_send(const char *strings_index_path,
|
||||
cserve2_index_list_send(int generation_id,
|
||||
const char *strings_index_path,
|
||||
const char *strings_entries_path,
|
||||
const char *files_index_path,
|
||||
const char *images_index_path,
|
||||
|
@ -56,6 +57,7 @@ cserve2_index_list_send(const char *strings_index_path,
|
|||
|
||||
memset(&msg, 0, size);
|
||||
msg.base.type = CSERVE2_INDEX_LIST;
|
||||
msg.generation_id = generation_id;
|
||||
if (strings_index_path)
|
||||
eina_strlcpy(msg.strings_index_path, strings_index_path, 64);
|
||||
if (strings_entries_path)
|
||||
|
|
|
@ -297,9 +297,9 @@ typedef int string_t;
|
|||
|
||||
struct _Shared_Array_Header {
|
||||
int32_t tag;
|
||||
int32_t generation_id;
|
||||
int32_t elemsize;
|
||||
int32_t count;
|
||||
int32_t generation_id;
|
||||
int32_t emptyidx;
|
||||
int32_t sortedidx;
|
||||
int32_t _reserved1;
|
||||
|
@ -310,6 +310,8 @@ struct _Shm_Object {
|
|||
SHMOBJECT;
|
||||
};
|
||||
|
||||
#define STRING_INDEX_ARRAY_TAG ('S' | 'T' << 8 | 'R' << 16 | 'N' << 24)
|
||||
#define STRING_MEMPOOL_FAKETAG ('S' | 'T' << 8 | 'R' << 16 | 'M' << 24)
|
||||
struct _Index_Entry {
|
||||
SHMOBJECT;
|
||||
// Block entry
|
||||
|
@ -318,6 +320,7 @@ struct _Index_Entry {
|
|||
int32_t shmid;
|
||||
};
|
||||
|
||||
#define FILE_DATA_ARRAY_TAG ('F' | 'I' << 8 | 'L' << 16 | 'E' << 24)
|
||||
struct _File_Data {
|
||||
SHMOBJECT;
|
||||
string_t path;
|
||||
|
@ -331,6 +334,7 @@ struct _File_Data {
|
|||
Eina_Bool invalid : 1;
|
||||
};
|
||||
|
||||
#define IMAGE_DATA_ARRAY_TAG ('I' | 'M' << 8 | 'A' << 16 | 'G' << 24)
|
||||
struct _Image_Data {
|
||||
SHMOBJECT;
|
||||
uint32_t file_id;
|
||||
|
@ -341,6 +345,7 @@ struct _Image_Data {
|
|||
Eina_Bool doload : 1;
|
||||
};
|
||||
|
||||
#define FONT_DATA_ARRAY_TAG ('F' | 'O' << 8 | 'N' << 16 | 'T' << 24)
|
||||
struct _Font_Data {
|
||||
SHMOBJECT;
|
||||
string_t name;
|
||||
|
@ -351,6 +356,8 @@ struct _Font_Data {
|
|||
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)
|
||||
struct _Glyph_Data {
|
||||
SHMOBJECT;
|
||||
uint32_t index;
|
||||
|
|
Loading…
Reference in New Issue