diff --git a/src/bin/evas/evas_cserve2.h b/src/bin/evas/evas_cserve2.h index badd33c8d6..c0a703ab51 100644 --- a/src/bin/evas/evas_cserve2.h +++ b/src/bin/evas/evas_cserve2.h @@ -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(); diff --git a/src/bin/evas/evas_cserve2_cache.c b/src/bin/evas/evas_cserve2_cache.c index 86fb80464c..9a9b82e0aa 100644 --- a/src/bin/evas/evas_cserve2_cache.c +++ b/src/bin/evas/evas_cserve2_cache.c @@ -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); } diff --git a/src/bin/evas/evas_cserve2_fonts.c b/src/bin/evas/evas_cserve2_fonts.c index 8690888943..ed0698cbaf 100644 --- a/src/bin/evas/evas_cserve2_fonts.c +++ b/src/bin/evas/evas_cserve2_fonts.c @@ -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; } diff --git a/src/bin/evas/evas_cserve2_index.c b/src/bin/evas/evas_cserve2_index.c index ec63660493..699ef95064 100644 --- a/src/bin/evas/evas_cserve2_index.c +++ b/src/bin/evas/evas_cserve2_index.c @@ -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++; } diff --git a/src/bin/evas/evas_cserve2_main.c b/src/bin/evas/evas_cserve2_main.c index 00a0fe4d9f..1509a9cd07 100644 --- a/src/bin/evas/evas_cserve2_main.c +++ b/src/bin/evas/evas_cserve2_main.c @@ -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) diff --git a/src/lib/evas/cserve2/evas_cs2.h b/src/lib/evas/cserve2/evas_cs2.h index 32e70a7863..2d3ad05b12 100644 --- a/src/lib/evas/cserve2/evas_cs2.h +++ b/src/lib/evas/cserve2/evas_cs2.h @@ -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;