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:
Jean-Philippe Andre 2013-08-21 13:51:15 +09:00
parent 1e4ee656a0
commit 4f5c48236f
6 changed files with 111 additions and 37 deletions

View File

@ -254,7 +254,7 @@ void cserve2_client_del(Client *client);
void cserve2_client_deliver(Client *client); void cserve2_client_deliver(Client *client);
void cserve2_client_error_send(Client *client, unsigned int rid, int error_code); 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); 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_add(int fd, Fd_Flags flags, Fd_Watch_Cb cb, const void *data);
Eina_Bool cserve2_fd_watch_del(int fd); 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); void *user_data);
// Shared arrays (arrays of fixed size object) // 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); const char *cserve2_shared_array_name_get(Shared_Array *sa);
void cserve2_shared_array_del(Shared_Array *sa); void cserve2_shared_array_del(Shared_Array *sa);
int cserve2_shared_array_size_get(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_map_size_get(Shared_Array *sa);
int cserve2_shared_array_item_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_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_size_set(Shared_Array *sa, int newcount);
int cserve2_shared_array_item_new(Shared_Array *sa); int cserve2_shared_array_item_new(Shared_Array *sa);
void *cserve2_shared_array_item_data_get(Shared_Array *sa, int elemid); 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, Shared_Array_Repack_Skip_Cb skip,
Eina_Compare_Cb cmp, void *user_data); Eina_Compare_Cb cmp, void *user_data);
int cserve2_shared_array_item_find(Shared_Array *sa, void *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); 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 initsize); Shared_Mempool *cserve2_shared_mempool_new(int indextag, 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);
@ -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); int cserve2_shared_mempool_buffer_offset_get(Shared_Mempool *sm, int bufferid);
size_t cserve2_shared_mempool_size_get(Shared_Mempool *sm); 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_set(Shared_Mempool *sm, int generation_id);
// Shared strings // Shared strings
const char *cserve2_shared_strings_table_name_get(); const char *cserve2_shared_strings_table_name_get();

View File

@ -121,6 +121,7 @@ struct _File_Watch {
Eina_List *entries; Eina_List *entries;
}; };
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 _glyph_id = 0;
static unsigned int _font_data_id = 0; static unsigned int _font_data_id = 0;
@ -341,7 +342,9 @@ _repack()
DBG("Repacking file data array: %s", DBG("Repacking file data array: %s",
cserve2_shared_array_name_get(_file_data_array)); 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, _repack_skip_cb,
_shm_object_id_cmp_cb, NULL); _shm_object_id_cmp_cb, NULL);
if (!sa) if (!sa)
@ -364,7 +367,10 @@ skip_files:
DBG("Repacking image data array: %s", DBG("Repacking image data array: %s",
cserve2_shared_array_name_get(_image_data_array)); 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, _repack_skip_cb,
_shm_object_id_cmp_cb, NULL); _shm_object_id_cmp_cb, NULL);
if (!sa) if (!sa)
@ -387,7 +393,10 @@ skip_images:
DBG("Repacking font data array: %s", DBG("Repacking font data array: %s",
cserve2_shared_array_name_get(_font_data_array)); 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, _repack_skip_cb,
_shm_object_id_cmp_cb, NULL); _shm_object_id_cmp_cb, NULL);
if (!sa) if (!sa)
@ -404,12 +413,19 @@ skip_images:
skip_fonts: skip_fonts:
if (updated) if (updated)
cserve2_index_list_send(cserve2_shared_strings_index_name_get(), {
cserve2_shared_strings_table_name_get(), // TODO: Update strings table generation_id?
cserve2_shared_array_name_get(_file_data_array), cserve2_shared_array_generation_id_set(_font_data_array, _generation_id);
cserve2_shared_array_name_get(_image_data_array), cserve2_shared_array_generation_id_set(_image_data_array, _generation_id);
cserve2_shared_array_name_get(_font_data_array), cserve2_shared_array_generation_id_set(_file_data_array, _generation_id);
NULL); 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), EINA_FREE_CB(_font_entry_free),
5); 5);
_file_data_array = cserve2_shared_array_new(1, sizeof(File_Data), 0); _generation_id++;
_image_data_array = cserve2_shared_array_new(1, sizeof(Image_Data), 0); _file_data_array = cserve2_shared_array_new(FILE_DATA_ARRAY_TAG,
_font_data_array = cserve2_shared_array_new(1, sizeof(Font_Data), 0); _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 void
@ -1411,7 +1434,8 @@ cserve2_cache_client_new(Client *client)
client->images.referencing = eina_hash_int32_new(_entry_free_cb); client->images.referencing = eina_hash_int32_new(_entry_free_cb);
client->fonts.referencing = NULL; 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_strings_table_name_get(),
cserve2_shared_array_name_get(_file_data_array), cserve2_shared_array_name_get(_file_data_array),
cserve2_shared_array_name_get(_image_data_array), cserve2_shared_array_name_get(_image_data_array),
@ -1958,13 +1982,18 @@ _glyphs_load_request_response(Glyphs_Request *req,
if (!mempool) 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); font_mem_usage += cserve2_shared_mempool_size_get(mempool);
} }
else
cserve2_shared_mempool_generation_id_set(mempool, _generation_id);
if (!fe->glyph_datas) 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); font_mem_usage += cserve2_shared_array_map_size_get(fe->glyph_datas);
} }

View File

@ -490,7 +490,8 @@ _font_slave_glyphs_load(const void *cmddata, void *data EINA_UNUSED)
if (!response->mempool) if (!response->mempool)
{ {
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(shmsize); response->mempool = cserve2_shared_mempool_new(GLYPH_DATA_ARRAY_TAG,
0, shmsize);
if (!response->mempool) return NULL; if (!response->mempool) return NULL;
} }

View File

@ -149,7 +149,7 @@ _block_rbtree_block_find(const Block *node, const void *key,
// Data shm // Data shm
static Data_Shm * static Data_Shm *
_shared_data_shm_new(int size) _shared_data_shm_new(const char *infix, int size)
{ {
Data_Shm *ds; Data_Shm *ds;
size_t mapping_size; size_t mapping_size;
@ -162,7 +162,7 @@ _shared_data_shm_new(int size)
mapping_size = cserve2_shm_size_normalize((size_t) 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) if (!ds->shm)
{ {
ERR("Could not create shm of size %u", (unsigned) mapping_size); 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 // Arrays
Shared_Array * 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; Shared_Array *sa;
Data_Shm *ds; Data_Shm *ds;
@ -243,7 +243,7 @@ cserve2_shared_array_new(int tag, int elemsize, int initcount)
if (!initcount) initcount = 1; if (!initcount) initcount = 1;
mapping_size = cserve2_shm_size_normalize(elemsize * initcount mapping_size = cserve2_shm_size_normalize(elemsize * initcount
+ sizeof(Shared_Array_Header)); + sizeof(Shared_Array_Header));
ds = _shared_data_shm_new(mapping_size); ds = _shared_data_shm_new("array", mapping_size);
if (!ds) if (!ds)
{ {
free(sa); 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 = (Shared_Array_Header *) ds->data;
sa->header->count = (mapping_size - sizeof(Shared_Array_Header)) / elemsize; sa->header->count = (mapping_size - sizeof(Shared_Array_Header)) / elemsize;
sa->header->elemsize = elemsize; sa->header->elemsize = elemsize;
sa->header->generation_id = 1; sa->header->generation_id = generation_id;
sa->header->emptyidx = 0; sa->header->emptyidx = 0;
sa->header->sortedidx = 0; sa->header->sortedidx = 0;
sa->header->tag = tag; sa->header->tag = tag;
@ -313,6 +313,16 @@ cserve2_shared_array_generation_id_get(Shared_Array *sa)
return sa->header->generation_id; 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 int
cserve2_shared_array_size_set(Shared_Array *sa, int newcount) 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 * 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, Shared_Array_Repack_Skip_Cb skip,
Eina_Compare_Cb cmp, Eina_Compare_Cb cmp,
void *user_data) void *user_data)
@ -413,13 +423,12 @@ cserve2_shared_array_repack(Shared_Array *sa,
} }
// Create new array // 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) if (!sa)
{ {
ERR("Can not repack array: failed to create new array"); ERR("Can not repack array: failed to create new array");
return NULL; return NULL;
} }
sa2->header->generation_id = sa->header->generation_id + 1;
// Write data // Write data
dstdata = sa2->ds->data + sizeof(Shared_Array_Header); 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 * static Shared_Index *
_shared_index_new() _shared_index_new(int tag, int generation_id)
{ {
Shared_Index *si; Shared_Index *si;
Index_Entry *ie; Index_Entry *ie;
int tag = 1234; // FIXME?
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, sizeof(Index_Entry), 1); si->sa = cserve2_shared_array_new(tag, generation_id, sizeof(Index_Entry), 0);
if (!si->sa) if (!si->sa)
{ {
free(si); free(si);
@ -607,7 +615,7 @@ _shared_index_del(Shared_Index *si)
// Shared memory pool // Shared memory pool
Shared_Mempool * Shared_Mempool *
cserve2_shared_mempool_new(int initsize) cserve2_shared_mempool_new(int indextag, int generation_id, int initsize)
{ {
Shared_Mempool *sm; Shared_Mempool *sm;
size_t mapping_size; size_t mapping_size;
@ -620,14 +628,14 @@ cserve2_shared_mempool_new(int initsize)
if (!initsize) initsize = 1; if (!initsize) initsize = 1;
mapping_size = cserve2_shm_size_normalize((size_t) initsize); 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) if (!sm->ds)
{ {
free(sm); free(sm);
return NULL; return NULL;
} }
sm->index = _shared_index_new(); sm->index = _shared_index_new(indextag, generation_id);
if (!sm->index) if (!sm->index)
{ {
_shared_data_shm_del(sm->ds); _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); 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 // Shared strings
@ -959,9 +985,15 @@ cserve2_shared_index_init(void)
{ {
if (!_instances) if (!_instances)
{ {
char faketag[5] = {0};
int ifaketag = STRING_MEMPOOL_FAKETAG;
DBG("Initializing shared index"); 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); _string_entries = eina_hash_string_djb2_new(NULL);
memcpy(faketag, &ifaketag, sizeof(int));
cserve2_shared_string_add(faketag);
} }
_instances++; _instances++;
} }

View File

@ -36,7 +36,8 @@ cserve2_client_error_send(Client *client, unsigned int rid, int error_code)
} }
void 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 *strings_entries_path,
const char *files_index_path, const char *files_index_path,
const char *images_index_path, const char *images_index_path,
@ -56,6 +57,7 @@ cserve2_index_list_send(const char *strings_index_path,
memset(&msg, 0, size); memset(&msg, 0, size);
msg.base.type = CSERVE2_INDEX_LIST; msg.base.type = CSERVE2_INDEX_LIST;
msg.generation_id = generation_id;
if (strings_index_path) if (strings_index_path)
eina_strlcpy(msg.strings_index_path, strings_index_path, 64); eina_strlcpy(msg.strings_index_path, strings_index_path, 64);
if (strings_entries_path) if (strings_entries_path)

View File

@ -297,9 +297,9 @@ typedef int string_t;
struct _Shared_Array_Header { struct _Shared_Array_Header {
int32_t tag; int32_t tag;
int32_t generation_id;
int32_t elemsize; int32_t elemsize;
int32_t count; int32_t count;
int32_t generation_id;
int32_t emptyidx; int32_t emptyidx;
int32_t sortedidx; int32_t sortedidx;
int32_t _reserved1; int32_t _reserved1;
@ -310,6 +310,8 @@ struct _Shm_Object {
SHMOBJECT; 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 { struct _Index_Entry {
SHMOBJECT; SHMOBJECT;
// Block entry // Block entry
@ -318,6 +320,7 @@ struct _Index_Entry {
int32_t shmid; int32_t shmid;
}; };
#define FILE_DATA_ARRAY_TAG ('F' | 'I' << 8 | 'L' << 16 | 'E' << 24)
struct _File_Data { struct _File_Data {
SHMOBJECT; SHMOBJECT;
string_t path; string_t path;
@ -331,6 +334,7 @@ struct _File_Data {
Eina_Bool invalid : 1; Eina_Bool invalid : 1;
}; };
#define IMAGE_DATA_ARRAY_TAG ('I' | 'M' << 8 | 'A' << 16 | 'G' << 24)
struct _Image_Data { struct _Image_Data {
SHMOBJECT; SHMOBJECT;
uint32_t file_id; uint32_t file_id;
@ -341,6 +345,7 @@ struct _Image_Data {
Eina_Bool doload : 1; Eina_Bool doload : 1;
}; };
#define FONT_DATA_ARRAY_TAG ('F' | 'O' << 8 | 'N' << 16 | 'T' << 24)
struct _Font_Data { struct _Font_Data {
SHMOBJECT; SHMOBJECT;
string_t name; string_t name;
@ -351,6 +356,8 @@ 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)
struct _Glyph_Data { struct _Glyph_Data {
SHMOBJECT; SHMOBJECT;
uint32_t index; uint32_t index;