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_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();

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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++;
}

View File

@ -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)

View File

@ -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;