From: Enlightenment S. <no-...@en...> - 2012-05-03 21:18:02
|
Log: Why this doesn't break for me? Now I have to use the bot for testing. Author: sachiel Date: 2012-05-03 14:17:55 -0700 (Thu, 03 May 2012) New Revision: 70700 Trac: http://trac.enlightenment.org/e/changeset/70700 Modified: trunk/evas/src/bin/Makefile.am Modified: trunk/evas/src/bin/Makefile.am =================================================================== --- trunk/evas/src/bin/Makefile.am 2012-05-03 21:01:31 UTC (rev 70699) +++ trunk/evas/src/bin/Makefile.am 2012-05-03 21:17:55 UTC (rev 70700) @@ -68,7 +68,8 @@ evas_cserve2_main_loop_linux.c evas_cserve2_LDADD = \ -@EINA_LIBS@ +@EINA_LIBS@ \ +@EFL_SHM_OPEN_LIBS@ evas_cserve2_client_SOURCES = \ evas_cserve2_client.c @@ -80,12 +81,14 @@ evas_cserve2_slave_LDFLAGS = -export-dynamic evas_cserve2_slave_LDADD = \ -@EINA_LIBS@ +@EINA_LIBS@ \ +@EFL_SHM_OPEN_LIBS@ dummy_slave_SOURCES = \ dummy_slave.c dummy_slave_LDADD = \ -@EINA_LIBS@ +@EINA_LIBS@ \ +@EFL_SHM_OPEN_LIBS@ endif |
From: Enlightenment S. <no-...@en...> - 2012-05-14 15:05:15
|
Log: bot warnings begone, hopefully Author: sachiel Date: 2012-05-14 08:05:04 -0700 (Mon, 14 May 2012) New Revision: 71076 Trac: http://trac.enlightenment.org/e/changeset/71076 Modified: trunk/evas/src/bin/evas_cserve2_cache.c trunk/evas/src/bin/evas_cserve2_main_loop_linux.c Modified: trunk/evas/src/bin/evas_cserve2_cache.c =================================================================== --- trunk/evas/src/bin/evas_cserve2_cache.c 2012-05-14 14:41:47 UTC (rev 71075) +++ trunk/evas/src/bin/evas_cserve2_cache.c 2012-05-14 15:05:04 UTC (rev 71076) @@ -853,8 +853,8 @@ int cserve2_cache_file_open(Client *client, unsigned int client_file_id, const char *path, const char *key, unsigned int rid) { - uintptr_t file_id; - Entry *entry; + unsigned int file_id; + File_Data *entry; Reference *ref; File_Watch *fw; char buf[4906]; @@ -884,10 +884,10 @@ // search whether the file is already opened by another client snprintf(buf, sizeof(buf), "%s:%s", path, key); - file_id = (uintptr_t)eina_hash_find(file_ids, buf); + file_id = (unsigned int)eina_hash_find(file_ids, buf); if (file_id) { - DBG("found file_id %d for client file id %d", + DBG("found file_id %u for client file id %d", file_id, client_file_id); entry = eina_hash_find(file_entries, &file_id); if (!entry) @@ -910,7 +910,7 @@ while ((file_id == 0) || (eina_hash_find(file_entries, &file_id))) file_id = _file_id++; - DBG("Creating new entry with file_id: %d for file \"%s:%s\"", + DBG("Creating new entry with file_id: %u for file \"%s:%s\"", file_id, path, key); entry = calloc(1, sizeof(*entry)); entry->type = CSERVE2_IMAGE_FILE; @@ -1247,7 +1247,7 @@ EINA_LIST_FOREACH(entry->references, l, ref) { - Eina_Hash *hash; + Eina_Hash *hash = NULL; if (entry->type == CSERVE2_IMAGE_FILE) hash = ref->client->files.referencing; else if (entry->type == CSERVE2_IMAGE_DATA) Modified: trunk/evas/src/bin/evas_cserve2_main_loop_linux.c =================================================================== --- trunk/evas/src/bin/evas_cserve2_main_loop_linux.c 2012-05-14 14:41:47 UTC (rev 71075) +++ trunk/evas/src/bin/evas_cserve2_main_loop_linux.c 2012-05-14 15:05:04 UTC (rev 71076) @@ -355,7 +355,7 @@ cserve2_main_loop_setup(void) { int sfd; - int socket; + int sock; int ifd; epoll_fd = epoll_create1(EPOLL_CLOEXEC); @@ -393,18 +393,18 @@ return EINA_FALSE; } - socket = _socketfd_setup(); - if (socket == -1) + sock = _socketfd_setup(); + if (sock == -1) { ERR("Could not setup socketfd."); goto error_socket; } - DBG("Add watch for socket fd: %d", socket); - if (!cserve2_fd_watch_add(socket, FD_READ, _socketfd_handler, NULL)) + DBG("Add watch for socket fd: %d", sock); + if (!cserve2_fd_watch_add(sock, FD_READ, _socketfd_handler, NULL)) { ERR("Could not add watch for socketf."); - close(socket); + close(sock); goto error_socket; } |
From: Enlightenment S. <no-...@en...> - 2012-05-14 15:17:23
|
Log: and fix wrong merge, damn it! Author: sachiel Date: 2012-05-14 08:17:12 -0700 (Mon, 14 May 2012) New Revision: 71077 Trac: http://trac.enlightenment.org/e/changeset/71077 Modified: trunk/evas/src/bin/evas_cserve2_cache.c Modified: trunk/evas/src/bin/evas_cserve2_cache.c =================================================================== --- trunk/evas/src/bin/evas_cserve2_cache.c 2012-05-14 15:05:04 UTC (rev 71076) +++ trunk/evas/src/bin/evas_cserve2_cache.c 2012-05-14 15:17:12 UTC (rev 71077) @@ -854,7 +854,7 @@ cserve2_cache_file_open(Client *client, unsigned int client_file_id, const char *path, const char *key, unsigned int rid) { unsigned int file_id; - File_Data *entry; + Entry *entry; Reference *ref; File_Watch *fw; char buf[4906]; |
From: Enlightenment S. <no-...@en...> - 2012-05-23 17:13:58
|
Log: Lil' refactor on CServe2's cache. More to come when the last book of 'A Song of Ice and Fire' is published. Author: sachiel Date: 2012-05-23 10:13:46 -0700 (Wed, 23 May 2012) New Revision: 71356 Trac: http://trac.enlightenment.org/e/changeset/71356 Modified: trunk/evas/src/bin/evas_cserve2.h trunk/evas/src/bin/evas_cserve2_cache.c trunk/evas/src/bin/evas_cserve2_main.c Modified: trunk/evas/src/bin/evas_cserve2.h =================================================================== --- trunk/evas/src/bin/evas_cserve2.h 2012-05-23 10:56:17 UTC (rev 71355) +++ trunk/evas/src/bin/evas_cserve2.h 2012-05-23 17:13:46 UTC (rev 71356) @@ -172,9 +172,6 @@ void cserve2_cache_image_unload(Client *client, unsigned int client_image_id); void cserve2_cache_requests_process(void); +void cserve2_cache_requests_response(Slave_Command type, void *msg, void *data); -void cserve2_cache_request_opened(Slave_Msg_Image_Opened *resp, void *data); -void cserve2_cache_request_loaded(Slave_Msg_Image_Loaded *resp, void *data); -void cserve2_cache_request_failed(void *data, Error_Type error); - #endif /* _EVAS_CSERVE2_H */ Modified: trunk/evas/src/bin/evas_cserve2_cache.c =================================================================== --- trunk/evas/src/bin/evas_cserve2_cache.c 2012-05-23 10:56:17 UTC (rev 71355) +++ trunk/evas/src/bin/evas_cserve2_cache.c 2012-05-23 17:13:46 UTC (rev 71356) @@ -6,7 +6,9 @@ #include "evas_cserve2.h" +typedef struct _Request_Funcs Request_Funcs; typedef struct _Request Request; + typedef struct _Entry Entry; typedef struct _Reference Reference; typedef struct _Waiter Waiter; @@ -14,18 +16,37 @@ typedef struct _Image_Data Image_Data; typedef struct _File_Watch File_Watch; -typedef enum { - CSERVE2_IMAGE_FILE, - CSERVE2_IMAGE_DATA -} Entry_Type; +typedef void *(*Request_Msg_Create)(Entry *e, int *size); +typedef void (*Request_Response)(Entry *e, void *resp); +typedef void (*Request_Error)(Entry *e, Error_Type error); +struct _Request_Funcs { + Request_Msg_Create msg_create; + Request_Response response; + Request_Error error; +}; + struct _Request { Entry *entry; Eina_List *waiters; Eina_Bool processing; + Request_Funcs *funcs; }; +typedef enum { + CSERVE2_IMAGE_FILE, + CSERVE2_IMAGE_DATA +} Entry_Type; + +struct _Entry { + unsigned int id; + Eina_List *references; + Request *request; + Entry_Type type; +}; + struct _File_Data { + Entry base; char *path; char *key; int w, h; @@ -41,8 +62,9 @@ // Default values for load options commented below struct _Image_Data { + Entry base; unsigned int file_id; - Entry *file; + File_Data *file; struct { double dpi; // dpi < -1 int w, h; // w and h < -1 @@ -56,17 +78,6 @@ Eina_Bool doload : 1; }; -struct _Entry { - unsigned int id; - Eina_List *references; - Request *request; - Entry_Type type; - union { - File_Data file; - Image_Data image; - }; -}; - struct _Reference { Client *client; Entry *entry; @@ -85,16 +96,17 @@ Eina_List *entries; }; +static Eina_List *open_requests = NULL; +static Eina_List *load_requests = NULL; +static Eina_List *spload_requests = NULL; // speculative preload requests + static unsigned int _file_id = 0; // id unique number static unsigned int _image_id = 0; // id unique number static Eina_Hash *file_ids = NULL; // maps path + key --> file_id static Eina_Hash *file_entries = NULL; // maps file_id --> entry -static Eina_List *open_requests = NULL; static Eina_Hash *image_ids = NULL; // maps file id + load opts --> image id static Eina_Hash *image_entries = NULL; // maps image_id --> entry -static Eina_List *load_requests = NULL; -static Eina_List *spload_requests = NULL; // speculative preload requests static Eina_Hash *file_watch = NULL; @@ -103,6 +115,256 @@ static int max_unused_mem_usage = 5 * 1024; /* in kbytes */ static int unused_mem_usage = 0; +static void +_image_opened_send(Client *client, File_Data *entry, unsigned int rid) +{ + int size; + Msg_Opened msg; + + DBG("Sending OPENED reply for entry: %d and RID: %d.", entry->base.id, rid); + // clear the struct with possible paddings, since it is not aligned. + memset(&msg, 0, sizeof(msg)); + msg.base.rid = rid; + msg.base.type = CSERVE2_OPENED; + msg.image.w = entry->w; + msg.image.h = entry->h; + msg.image.frame_count = entry->frame_count; + msg.image.loop_count = entry->loop_count; + msg.image.loop_hint = entry->loop_hint; + msg.image.alpha = entry->alpha; + + size = sizeof(msg); + cserve2_client_send(client, &size, sizeof(size)); + cserve2_client_send(client, &msg, sizeof(msg)); + // _cserve2_cache_load_requests_process(); +} + +static void +_image_loaded_send(Client *client, Image_Data *entry, unsigned int rid) +{ + int size; + const char *shmpath = cserve2_shm_name_get(entry->shm); + Msg_Loaded msg; + int path_len; + char *buf; + + DBG("Sending LOADED reply for entry %d and RID: %d.", entry->base.id, rid); + path_len = strlen(shmpath) + 1; + + memset(&msg, 0, sizeof(msg)); + msg.base.rid = rid; + msg.base.type = CSERVE2_LOADED; + + msg.shm.mmap_offset = cserve2_shm_map_offset_get(entry->shm); + msg.shm.use_offset = cserve2_shm_offset_get(entry->shm); + msg.shm.mmap_size = cserve2_shm_map_size_get(entry->shm); + msg.shm.image_size = cserve2_shm_size_get(entry->shm); + msg.alpha_sparse = entry->alpha_sparse; + + buf = malloc(sizeof(msg) + path_len); + + memcpy(buf, &msg, sizeof(msg)); + memcpy(buf + sizeof(msg), shmpath, path_len); + + size = sizeof(msg) + path_len; + + cserve2_client_send(client, &size, sizeof(size)); + cserve2_client_send(client, buf, size); + + free(buf); +} + +static void +_image_preloaded_send(Client *client, unsigned int rid) +{ + int size; + Msg_Preloaded msg; + + DBG("Sending PRELOADED reply for RID: %d.", rid); + memset(&msg, 0, sizeof(msg)); + msg.base.rid = rid; + msg.base.type = CSERVE2_PRELOADED; + + size = sizeof(msg); + cserve2_client_send(client, &size, sizeof(size)); + cserve2_client_send(client, &msg, size); +} + +static void * +_open_request_build(File_Data *f, int *bufsize) +{ + char *buf; + int size, pathlen, keylen; + Slave_Msg_Image_Open msg; + + pathlen = strlen(f->path) + 1; + keylen = strlen(f->key) + 1; + + size = sizeof(msg) + pathlen + keylen; + buf = malloc(size); + if (!buf) return NULL; + + memset(&msg, 0, sizeof(msg)); + memcpy(buf, &msg, sizeof(msg)); + memcpy(buf + sizeof(msg), f->path, pathlen); + memcpy(buf + sizeof(msg) + pathlen, f->key, keylen); + + *bufsize = size; + return buf; +} + +static void +_request_failed(Entry *e, Error_Type type) +{ + Waiter *w; + Eina_List *l; + Reference *ref; + + DBG("Request for entry %p failed with error %d", e, type); + EINA_LIST_FREE(e->request->waiters, w) + { + cserve2_client_error_send(w->ref->client, w->rid, type); + + w->ref->count--; + free(w); + } + + EINA_LIST_FOREACH(e->references, l, ref) + { + Eina_Hash *hash = NULL; + if (e->type == CSERVE2_IMAGE_FILE) + hash = ref->client->files.referencing; + else if (e->type == CSERVE2_IMAGE_DATA) + hash = ref->client->images.referencing; + + eina_hash_del_by_key(hash, &(ref->client_entry_id)); + } +} + +static void +_open_request_response(File_Data *e, Slave_Msg_Image_Opened *resp) +{ + Waiter *w; + + e->w = resp->w; + e->h = resp->h; + e->frame_count = resp->frame_count; + e->loop_count = resp->loop_count; + e->loop_hint = resp->loop_hint; + e->alpha = resp->alpha; + if (resp->has_loader_data) + { + const char *ldata = (const char *)resp + + sizeof(Slave_Msg_Image_Opened); + e->loader_data = eina_stringshare_add(ldata); + } + + DBG("Finished opening file %d. Notifying %d waiters.", e->base.id, + e->base.request->waiters ? eina_list_count(e->base.request->waiters) : 0); + EINA_LIST_FREE(e->base.request->waiters, w) + { + _image_opened_send(w->ref->client, e, w->rid); + free(w); + } +} + +static Request_Funcs _open_funcs = { + .msg_create = (Request_Msg_Create)_open_request_build, + .response = (Request_Response)_open_request_response, + .error = (Request_Error)_request_failed +}; + +static void * +_load_request_build(Image_Data *i, int *bufsize) +{ + char *buf, *ptr; + const char *shmpath; + int size; + int shmlen, filelen, keylen, loaderlen; + Slave_Msg_Image_Load msg; + + // opening shm for this file + i->shm = cserve2_shm_request(i->file->w * i->file->h * 4); + + shmpath = cserve2_shm_name_get(i->shm); + + shmlen = strlen(shmpath) + 1; + filelen = strlen(i->file->path) + 1; + keylen = strlen(i->file->key) + 1; + if (i->file->loader_data) + loaderlen = strlen(i->file->loader_data) + 1; + else + loaderlen = 0; + + size = sizeof(msg) + shmlen + filelen + keylen + loaderlen; + buf = malloc(size); + if (!buf) return NULL; + + memset(&msg, 0, sizeof(msg)); + msg.w = i->file->w; + msg.h = i->file->h; + msg.alpha = i->file->alpha; + msg.opts.w = i->opts.w; + msg.opts.h = i->opts.h; + msg.opts.rx = i->opts.rx; + msg.opts.ry = i->opts.ry; + msg.opts.rw = i->opts.rw; + msg.opts.rh = i->opts.rh; + msg.opts.scale_down_by = i->opts.scale_down; + msg.opts.dpi = i->opts.dpi; + msg.opts.orientation = i->opts.orientation; + + msg.shm.mmap_offset = cserve2_shm_map_offset_get(i->shm); + msg.shm.image_offset = cserve2_shm_offset_get(i->shm); + msg.shm.mmap_size = cserve2_shm_map_size_get(i->shm); + msg.shm.image_size = cserve2_shm_size_get(i->shm); + + msg.has_loader_data = !!loaderlen; + + memcpy(buf, &msg, sizeof(msg)); + ptr = buf + sizeof(msg); + + memcpy(ptr, shmpath, shmlen); + ptr += shmlen; + memcpy(ptr, i->file->path, filelen); + ptr += filelen; + memcpy(ptr, i->file->key, keylen); + ptr += keylen; + memcpy(ptr, i->file->loader_data, loaderlen); + + *bufsize = size; + return buf; +} + +static void +_load_request_response(Image_Data *e, Slave_Msg_Image_Loaded *resp) +{ + Waiter *w; + + e->alpha_sparse = resp->alpha_sparse; + if (!e->doload) + DBG("Entry %d loaded by speculative preload.", e->base.id); + + DBG("Finished loading image %d. Notifying %d waiters.", e->base.id, + e->base.request->waiters ? eina_list_count(e->base.request->waiters) : 0); + EINA_LIST_FREE(e->base.request->waiters, w) + { + if (w->type == CSERVE2_LOAD) + _image_loaded_send(w->ref->client, e, w->rid); + else if (w->type == CSERVE2_PRELOAD) + _image_preloaded_send(w->ref->client, w->rid); + // else w->type == CSERVE2_SETOPTS --> do nothing + + free(w); + } +} + +static Request_Funcs _load_funcs = { + .msg_create = (Request_Msg_Create)_load_request_build, + .response = (Request_Response)_load_request_response, + .error = (Request_Error)_request_failed +}; + static unsigned int _img_opts_id_get(Image_Data *im, char *buf, int size) { @@ -119,120 +381,122 @@ } static int -_image_entry_size_get(Entry *e) +_image_entry_size_get(Image_Data *e) { - int size = sizeof(Entry); + int size = sizeof(Image_Data); /* XXX: get the overhead of the shm handler too */ - if (e->image.shm) - size += cserve2_shm_size_get(e->image.shm); + if (e->shm) + size += cserve2_shm_size_get(e->shm); return size / 1024; } static void -_file_id_free(Entry *entry) +_file_id_free(File_Data *entry) { char buf[4096]; DBG("Removing entry file id: %d, file: \"%s:%s\"", - entry->id, entry->file.path, entry->file.key); - snprintf(buf, sizeof(buf), "%s:%s", entry->file.path, entry->file.key); + entry->base.id, entry->path, entry->key); + snprintf(buf, sizeof(buf), "%s:%s", entry->path, entry->key); eina_hash_del_by_key(file_ids, buf); } static void -_image_id_free(Entry *entry) +_image_id_free(Image_Data *entry) { char buf[4096]; - DBG("Removing entry image id: %d", entry->id); + DBG("Removing entry image id: %d", entry->base.id); - _img_opts_id_get(&entry->image, buf, sizeof(buf)); + _img_opts_id_get(entry, buf, sizeof(buf)); eina_hash_del_by_key(image_ids, buf); } static void -_image_entry_free(Entry *entry) +_image_entry_free(Image_Data *entry) { - Entry *fentry = entry->image.file; + File_Data *fentry = entry->file; - if (entry->request) + if (entry->base.request) { - if (entry->request->processing) - entry->request->entry = NULL; - else if (!entry->request->waiters) + if (entry->base.request->processing) + entry->base.request->entry = NULL; + else if (!entry->base.request->waiters) { - if (entry->image.doload) - load_requests = eina_list_remove(load_requests, entry->request); + if (entry->doload) + load_requests = eina_list_remove(load_requests, + entry->base.request); else spload_requests = eina_list_remove(spload_requests, - entry->request); + entry->base.request); } } - if (entry->image.unused) + if (entry->unused) { image_entries_lru = eina_list_remove(image_entries_lru, entry); unused_mem_usage -= _image_entry_size_get(entry); } if (fentry) - fentry->file.images = eina_list_remove(fentry->file.images, entry); - if (entry->image.shm) - cserve2_shm_unref(entry->image.shm); + fentry->images = eina_list_remove(fentry->images, entry); + if (entry->shm) + cserve2_shm_unref(entry->shm); free(entry); } static void _hash_image_entry_free(void *data) { - Entry *entry = data; + Image_Data *entry = data; _image_id_free(entry); _image_entry_free(entry); } static void -_file_entry_free(Entry *entry) +_file_entry_free(File_Data *entry) { File_Watch *fw; // Should we call free for each of the images too? // If everything goes fine, it's not necessary. - if (entry->file.images) + if (entry->images) { ERR("Freeing file %d (\"%s:%s\") image data still referenced.", - entry->id, entry->file.path, entry->file.key); - eina_list_free(entry->file.images); + entry->base.id, entry->path, entry->key); + eina_list_free(entry->images); } - if (entry->request) + if (entry->base.request) { - if (entry->request->processing) - entry->request->entry = NULL; - else if (!entry->request->waiters) + if (entry->base.request->processing) + entry->base.request->entry = NULL; + else if (!entry->base.request->waiters) { - open_requests = eina_list_remove(open_requests, entry->request); - free(entry->request); + open_requests = eina_list_remove(open_requests, + entry->base.request); + free(entry->base.request); } } - if ((fw = entry->file.watcher)) + if ((fw = entry->watcher)) { fw->entries = eina_list_remove(fw->entries, entry); if (!fw->entries) eina_hash_del_by_key(file_watch, fw->path); } - free(entry->file.key); - free(entry->file.path); - eina_stringshare_del(entry->file.loader_data); + free(entry->key); + free(entry->path); + eina_stringshare_del(entry->loader_data); free(entry); } static void _hash_file_entry_free(void *data) { - Entry *entry = data; + File_Data *entry = data; // TODO: Add some checks to make sure that we are freeing an // unused entry. @@ -292,7 +556,7 @@ // FIXME: Should this be really here? I guess that it should be in the // entry_free_cb function, or entry_reference_del, when there are no more // references - if (!req->waiters && !req->entry) + if (!req->entry && !req->waiters) { *requests = eina_list_remove(*requests, req); free(req); @@ -316,23 +580,7 @@ free(req); } -/* static void -_open_request_del(Request *req) -{ - Waiter *it; - - EINA_LIST_FREE(req->waiters, it) - free(it); - - req->entry->request = NULL; - - open_requests = eina_list_remove(open_requests, req); - free(req); -} -*/ - -static void _request_answer_add(Request *req, Reference *ref, unsigned int rid, Message_Type type) { Waiter *w = malloc(sizeof(*w)); @@ -359,6 +607,10 @@ req->waiters = NULL; req->processing = EINA_FALSE; entry->request = req; + if (type == CSERVE2_OPEN) + req->funcs = &_open_funcs; + else + req->funcs = &_load_funcs; *requests = eina_list_append(*requests, req); DBG("Add request for entry id: %d, client: %d, rid: %d", req->entry->id, ref->client->id, rid); @@ -392,34 +644,24 @@ _cserve2_cache_open_requests_process(int nloaders) { Request *req; - Slave_Msg_Image_Open msg; - Entry *entry; - char slave_cmd_data[4096]; + char *slave_cmd_data; int slave_cmd_size; - int path_len, key_len; while ((nloaders > 0) && (open_requests)) { - // remove the first element from the list and process this element req = eina_list_data_get(open_requests); open_requests = eina_list_remove_list(open_requests, open_requests); - entry = req->entry; - DBG("Processing OPEN request for file entry: %d", entry->id); + DBG("Processing OPEN request for file entry: %d", req->entry->id); - memset(&msg, 0, sizeof(msg)); - memcpy(slave_cmd_data, &msg, sizeof(msg)); + slave_cmd_data = req->funcs->msg_create(req->entry, &slave_cmd_size); - path_len = strlen(entry->file.path) + 1; - key_len = strlen(entry->file.key) + 1; - slave_cmd_size = sizeof(msg) + path_len + key_len; - memcpy(slave_cmd_data + sizeof(msg), entry->file.path, path_len); - memcpy(slave_cmd_data + sizeof(msg) + path_len, entry->file.key, - key_len); cserve2_slave_cmd_dispatch(req, IMAGE_OPEN, slave_cmd_data, slave_cmd_size); + free(slave_cmd_data); + req->processing = EINA_TRUE; nloaders--; } @@ -427,134 +669,6 @@ return nloaders; } -static void -_image_preloaded_send(Client *client, unsigned int rid) -{ - int size; - Msg_Preloaded msg; - - DBG("Sending PRELOADED reply for RID: %d.", rid); - memset(&msg, 0, sizeof(msg)); - msg.base.rid = rid; - msg.base.type = CSERVE2_PRELOADED; - - size = sizeof(msg); - cserve2_client_send(client, &size, sizeof(size)); - cserve2_client_send(client, &msg, size); -} - -static void -_image_loaded_send(Client *client, Entry *entry, unsigned int rid) -{ - int size; - const char *shmpath = cserve2_shm_name_get(entry->image.shm); - Msg_Loaded msg; - int path_len; - char *buf; - - DBG("Sending LOADED reply for entry %d and RID: %d.", entry->id, rid); - path_len = strlen(shmpath) + 1; - - memset(&msg, 0, sizeof(msg)); - msg.base.rid = rid; - msg.base.type = CSERVE2_LOADED; - - msg.shm.mmap_offset = cserve2_shm_map_offset_get(entry->image.shm); - msg.shm.use_offset = cserve2_shm_offset_get(entry->image.shm); - msg.shm.mmap_size = cserve2_shm_map_size_get(entry->image.shm); - msg.shm.image_size = cserve2_shm_size_get(entry->image.shm); - msg.alpha_sparse = entry->image.alpha_sparse; - - buf = malloc(sizeof(msg) + path_len); - - memcpy(buf, &msg, sizeof(msg)); - memcpy(buf + sizeof(msg), shmpath, path_len); - - size = sizeof(msg) + path_len; - - cserve2_client_send(client, &size, sizeof(size)); - cserve2_client_send(client, buf, size); - - free(buf); -} - -static void -_cserve2_cache_load_request_run(Request *req) -{ - Entry *fentry; - Shm_Handle *shm; - const char *shmpath, *file, *key, *loader; - int shmlen, filelen, keylen, loaderlen; - Slave_Msg_Image_Load msg; - char *buf, *cur; - Entry *ientry; - size_t size; - - ientry = req->entry; - - fentry = ientry->image.file; - // opening shm for this file - shm = cserve2_shm_request(fentry->file.w * fentry->file.h * 4); - shmpath = cserve2_shm_name_get(shm); - shmlen = strlen(shmpath) + 1; - - file = fentry->file.path; - filelen = strlen(file) + 1; - - key = fentry->file.key; - keylen = strlen(key) + 1; - - loader = fentry->file.loader_data; - if (!loader) - loaderlen = 0; - else - loaderlen = strlen(loader) + 1; - - memset(&msg, 0, sizeof(msg)); - msg.w = ientry->image.file->file.w; - msg.h = ientry->image.file->file.h; - msg.alpha = ientry->image.file->file.alpha; - msg.opts.w = ientry->image.opts.w; - msg.opts.h = ientry->image.opts.h; - msg.opts.rx = ientry->image.opts.rx; - msg.opts.ry = ientry->image.opts.ry; - msg.opts.rw = ientry->image.opts.rw; - msg.opts.rh = ientry->image.opts.rh; - msg.opts.scale_down_by = ientry->image.opts.scale_down; - msg.opts.dpi = ientry->image.opts.dpi; - msg.opts.orientation = ientry->image.opts.orientation; - - msg.shm.mmap_offset = cserve2_shm_map_offset_get(shm); - msg.shm.image_offset = cserve2_shm_offset_get(shm); - msg.shm.mmap_size = cserve2_shm_map_size_get(shm); - msg.shm.image_size = cserve2_shm_size_get(shm); - - msg.has_loader_data = !!loaderlen; - - size = sizeof(msg) + shmlen + filelen + keylen + loaderlen; - - buf = calloc(1, size); - - memcpy(buf, &msg, sizeof(msg)); - cur = buf + sizeof(msg); - memcpy(cur, shmpath, shmlen); - - cur += shmlen; - memcpy(cur, file, filelen); - - cur += filelen; - memcpy(cur, key, keylen); - - cur += keylen; - memcpy(cur, loader, loaderlen); - - ientry->image.shm = shm; - - cserve2_slave_cmd_dispatch(req, IMAGE_LOAD, buf, size); - - free(buf); -} - static int _cserve2_cache_load_requests_list_process(Eina_List **queue, int nloaders) { @@ -563,18 +677,23 @@ while ((nloaders > 0) && (*queue)) { + Image_Data *ientry; + char *buf; + int size; + // remove the first element from the list and process this element req = eina_list_data_get(*queue); *queue = eina_list_remove_list(*queue, *queue); - if (!req->entry->image.file) + ientry = (Image_Data *)req->entry; + if (!ientry->file) { ERR("File entry doesn't exist for entry id %d", req->entry->id); - cserve2_cache_request_failed(req, CSERVE2_INVALID_CACHE); + _request_failed(req->entry, CSERVE2_INVALID_CACHE); continue; } - if (req->entry->image.file->request) + if (ientry->file->base.request) { /* OPEN still pending, skip this request */ skipped = eina_list_append(skipped, req); @@ -583,8 +702,12 @@ DBG("Processing LOAD request for image entry: %d", req->entry->id); - _cserve2_cache_load_request_run(req); + buf = req->funcs->msg_create(req->entry, &size); + cserve2_slave_cmd_dispatch(req, IMAGE_LOAD, buf, size); + + free(buf); + req->processing = EINA_TRUE; nloaders--; @@ -616,13 +739,13 @@ } static void -_entry_unused_push(Entry *e) +_entry_unused_push(Image_Data *e) { int size = _image_entry_size_get(e); - if ((size > max_unused_mem_usage) || !(e->image.doload)) + if ((size > max_unused_mem_usage) || !(e->doload)) { - eina_hash_del_by_key(image_entries, &e->id); + eina_hash_del_by_key(image_entries, &e->base.id); return; } while (size > (max_unused_mem_usage - unused_mem_usage)) @@ -631,7 +754,7 @@ eina_hash_del_by_key(image_entries, &ie->id); } image_entries_lru = eina_list_append(image_entries_lru, e); - e->image.unused = EINA_TRUE; + e->unused = EINA_TRUE; unused_mem_usage += size; } @@ -645,28 +768,28 @@ if (entry->type == CSERVE2_IMAGE_FILE) { - if (entry->file.invalid) - _file_entry_free(entry); + File_Data *fentry = (File_Data *)entry; + + if (fentry->invalid) + _file_entry_free(fentry); else { - if (entry->file.images) - { - Entry *ie; - EINA_LIST_FREE(entry->file.images, ie) - ie->image.file = NULL; - entry->file.images = NULL; - } + Image_Data *ie; + EINA_LIST_FREE(fentry->images, ie) + ie->file = NULL; eina_hash_del_by_key(file_entries, &entry->id); } } else if (entry->type == CSERVE2_IMAGE_DATA) { - if (!entry->image.file) + Image_Data *ientry = (Image_Data *)entry; + + if (!ientry->file) eina_hash_del_by_key(image_entries, &entry->id); - else if (entry->image.file->file.invalid) - _image_entry_free(entry); + else if (ientry->file->invalid) + _image_entry_free(ientry); else - _entry_unused_push(entry); + _entry_unused_push(ientry); } else ERR("Wrong type of entry."); @@ -693,7 +816,7 @@ CSERVE2_REQUEST_CANCEL); else { - if (entry->image.doload) + if (((Image_Data *)entry)->doload) _request_answer_del(&load_requests, entry->request, ref->client, CSERVE2_REQUEST_CANCEL); else @@ -721,35 +844,11 @@ eina_hash_free(client->files.referencing); } -void -_image_opened_send(Client *client, Entry *entry, unsigned int rid) -{ - int size; - Msg_Opened msg; - - DBG("Sending OPENED reply for entry: %d and RID: %d.", entry->id, rid); - // clear the struct with possible paddings, since it is not aligned. - memset(&msg, 0, sizeof(msg)); - msg.base.rid = rid; - msg.base.type = CSERVE2_OPENED; - msg.image.w = entry->file.w; - msg.image.h = entry->file.h; - msg.image.frame_count = entry->file.frame_count; - msg.image.loop_count = entry->file.loop_count; - msg.image.loop_hint = entry->file.loop_hint; - msg.image.alpha = entry->file.alpha; - - size = sizeof(msg); - cserve2_client_send(client, &size, sizeof(size)); - cserve2_client_send(client, &msg, sizeof(msg)); - // _cserve2_cache_load_requests_process(); -} - -static Entry * +static Image_Data * _image_msg_new(Client *client, Msg_Setopts *msg) { Reference *ref; - Entry *im_entry; + Image_Data *im_entry; ref = eina_hash_find(client->files.referencing, &msg->file_id); if (!ref) @@ -760,7 +859,7 @@ CSERVE2_INVALID_CACHE); return NULL; } - if (ref->entry->file.invalid) + if (((File_Data *)ref->entry)->invalid) { cserve2_client_error_send(client, msg->base.rid, CSERVE2_FILE_CHANGED); @@ -768,82 +867,62 @@ } im_entry = calloc(1, sizeof(*im_entry)); - im_entry->type = CSERVE2_IMAGE_DATA; - im_entry->image.file_id = ref->entry->id; - im_entry->image.file = ref->entry; - im_entry->image.opts.dpi = msg->opts.dpi; - im_entry->image.opts.w = msg->opts.w; - im_entry->image.opts.h = msg->opts.h; - im_entry->image.opts.scale_down = msg->opts.scale_down; - im_entry->image.opts.rx = msg->opts.rx; - im_entry->image.opts.ry = msg->opts.ry; - im_entry->image.opts.rw = msg->opts.rw; - im_entry->image.opts.rh = msg->opts.rh; - im_entry->image.opts.orientation = msg->opts.orientation; + im_entry->base.type = CSERVE2_IMAGE_DATA; + im_entry->file_id = ref->entry->id; + im_entry->file = (File_Data *)ref->entry; + im_entry->opts.dpi = msg->opts.dpi; + im_entry->opts.w = msg->opts.w; + im_entry->opts.h = msg->opts.h; + im_entry->opts.scale_down = msg->opts.scale_down; + im_entry->opts.rx = msg->opts.rx; + im_entry->opts.ry = msg->opts.ry; + im_entry->opts.rw = msg->opts.rw; + im_entry->opts.rh = msg->opts.rh; + im_entry->opts.orientation = msg->opts.orientation; return im_entry; } -/* -static Entry * -_image_default_new(Entry *file_entry) -{ - Entry *im_entry = calloc(1, sizeof(*im_entry)); - im_entry->image.file_id = file_entry->id; - im_entry->image.opts.dpi = -1; - im_entry->image.opts.w = -1; - im_entry->image.opts.h = -1; - im_entry->image.opts.scale_down = -1; - im_entry->image.opts.rx = -1; - im_entry->image.opts.ry = -1; - im_entry->image.opts.rw = -1; - im_entry->image.opts.rh = -1; - im_entry->image.opts.orientation = 0; - - return im_entry; -} -*/ - static void _file_changed_cb(const char *path __UNUSED__, Eina_Bool deleted __UNUSED__, void *data) { File_Watch *fw = data; - Entry *e; + File_Data *e; Eina_List *l; EINA_LIST_FOREACH(fw->entries, l, e) { Eina_List *ll; - Entry *ie; + Image_Data *ie; - e->file.invalid = EINA_TRUE; - e->file.watcher = NULL; + e->invalid = EINA_TRUE; + e->watcher = NULL; - EINA_LIST_FOREACH(e->file.images, ll, ie) + EINA_LIST_FOREACH(e->images, ll, ie) { _image_id_free(ie); - eina_hash_set(image_entries, &ie->id, NULL); - if (ie->request && !ie->request->processing) + eina_hash_set(image_entries, &ie->base.id, NULL); + if (ie->base.request && !ie->base.request->processing) { - if (ie->image.doload) - _request_answer_all_del(&load_requests, ie->request, + if (ie->doload) + _request_answer_all_del(&load_requests, ie->base.request, CSERVE2_FILE_CHANGED); else - _request_answer_all_del(&spload_requests, ie->request, + _request_answer_all_del(&spload_requests, ie->base.request, CSERVE2_FILE_CHANGED); } - ie->request = NULL; - if (ie->image.unused) + ie->base.request = NULL; + if (ie->unused) _image_entry_free(ie); } _file_id_free(e); - eina_hash_set(file_entries, &e->id, NULL); - if (e->request && !e->request->processing) - _request_answer_all_del(&open_requests, ie->request, + eina_hash_set(file_entries, &e->base.id, NULL); + if (e->base.request && !e->base.request->processing) + _request_answer_all_del(&open_requests, e->base.request, CSERVE2_FILE_CHANGED); - e->request = NULL; - if (!e->file.images && !e->references) + e->base.request = NULL; + if (!e->images && !e->base.references) _file_entry_free(e); } @@ -854,7 +933,7 @@ cserve2_cache_file_open(Client *client, unsigned int client_file_id, const char *path, const char *key, unsigned int rid) { unsigned int file_id; - Entry *entry; + File_Data *entry; Reference *ref; File_Watch *fw; char buf[4906]; @@ -863,9 +942,9 @@ ref = eina_hash_find(client->files.referencing, &client_file_id); if (ref) { - entry = ref->entry; + entry = (File_Data *)ref->entry; - if (entry->file.invalid) + if (entry->invalid) { cserve2_client_error_send(client, rid, CSERVE2_FILE_CHANGED); return -1; @@ -875,8 +954,8 @@ ref->count++; // File already being loaded, just add the request to be replied - if (entry->request) - _request_answer_add(entry->request, ref, rid, CSERVE2_OPEN); + if (entry->base.request) + _request_answer_add(entry->base.request, ref, rid, CSERVE2_OPEN); else _image_opened_send(client, entry, rid); return 0; @@ -897,10 +976,10 @@ cserve2_client_error_send(client, rid, CSERVE2_INVALID_CACHE); return -1; } - ref = _entry_reference_add(entry, client, client_file_id); + ref = _entry_reference_add((Entry *)entry, client, client_file_id); eina_hash_add(client->files.referencing, &client_file_id, ref); - if (entry->request) - _request_answer_add(entry->request, ref, rid, CSERVE2_OPEN); + if (entry->base.request) + _request_answer_add(entry->base.request, ref, rid, CSERVE2_OPEN); else // File already loaded, otherwise there would be a request _image_opened_send(client, entry, rid); return 0; @@ -913,27 +992,27 @@ DBG("Creating new entry with file_id: %u for file \"%s:%s\"", file_id, path, key); entry = calloc(1, sizeof(*entry)); - entry->type = CSERVE2_IMAGE_FILE; - entry->file.path = strdup(path); - entry->file.key = strdup(key); - entry->id = file_id; + entry->base.type = CSERVE2_IMAGE_FILE; + entry->path = strdup(path); + entry->key = strdup(key); + entry->base.id = file_id; eina_hash_add(file_entries, &file_id, entry); eina_hash_add(file_ids, buf, (void *)file_id); - ref = _entry_reference_add(entry, client, client_file_id); + ref = _entry_reference_add((Entry *)entry, client, client_file_id); eina_hash_add(client->files.referencing, &client_file_id, ref); - fw = eina_hash_find(file_watch, entry->file.path); + fw = eina_hash_find(file_watch, entry->path); if (!fw) { fw = calloc(1, sizeof(File_Watch)); - fw->path = eina_stringshare_add(entry->file.path); + fw->path = eina_stringshare_add(entry->path); cserve2_file_change_watch_add(fw->path, _file_changed_cb, fw); eina_hash_direct_add(file_watch, fw->path, fw); } fw->entries = eina_list_append(fw->entries, entry); - entry->file.watcher = fw; + entry->watcher = fw; - _request_add(&open_requests, entry, ref, rid, CSERVE2_OPEN); + _request_add(&open_requests, (Entry *)entry, ref, rid, CSERVE2_OPEN); // _open_image_default_set(entry); @@ -960,8 +1039,8 @@ int cserve2_cache_image_opts_set(Client *client, Msg_Setopts *msg) { - Entry *entry; - Entry *fentry = NULL; + Image_Data *entry; + File_Data *fentry = NULL; Reference *ref, *oldref; unsigned int image_id; char buf[4096]; @@ -972,7 +1051,7 @@ entry = _image_msg_new(client, msg); if (!entry) return -1; - image_id = _img_opts_id_get(&entry->image, buf, sizeof(buf)); + image_id = _img_opts_id_get(entry, buf, sizeof(buf)); if (image_id) { // if so, just update the references free(entry); @@ -988,11 +1067,11 @@ return -1; } - if (entry->image.unused) + if (entry->unused) { DBG("Re-using old image entry (id: %d) from the LRU list.", - entry->id); - entry->image.unused = EINA_FALSE; + entry->base.id); + entry->unused = EINA_FALSE; image_entries_lru = eina_list_remove(image_entries_lru, entry); unused_mem_usage -= _image_entry_size_get(entry); } @@ -1000,7 +1079,7 @@ if (oldref && (oldref->entry->id == image_id)) return 0; - ref = _entry_reference_add(entry, client, msg->image_id); + ref = _entry_reference_add((Entry *)entry, client, msg->image_id); if (oldref) eina_hash_del_by_key(client->images.referencing, &msg->image_id); @@ -1014,26 +1093,27 @@ while ((image_id == 0) || (eina_hash_find(image_entries, &image_id))) image_id = _image_id++; - entry->id = image_id; + entry->base.id = image_id; eina_hash_add(image_entries, &image_id, entry); eina_hash_add(image_ids, buf, (void *)image_id); - ref = _entry_reference_add(entry, client, msg->image_id); + ref = _entry_reference_add((Entry *)entry, client, msg->image_id); if (oldref) eina_hash_del_by_key(client->images.referencing, &msg->image_id); eina_hash_add(client->images.referencing, &msg->image_id, ref); - fentry = entry->image.file; - fentry->file.images = eina_list_append(fentry->file.images, entry); + fentry = entry->file; + fentry->images = eina_list_append(fentry->images, entry); - _request_add(&spload_requests, entry, ref, msg->base.rid, CSERVE2_SETOPTS); + _request_add(&spload_requests, (Entry *)entry, ref, msg->base.rid, + CSERVE2_SETOPTS); return 0; } void cserve2_cache_image_load(Client *client, unsigned int client_image_id, unsigned int rid) { - Entry *entry; + Image_Data *entry; Reference *ref; ref = eina_hash_find(client->images.referencing, &client_image_id); @@ -1043,7 +1123,10 @@ client->id, client_image_id); return; } - if (ref->entry->image.file->file.invalid) + + entry = (Image_Data *)ref->entry; + + if (entry->file->invalid) { cserve2_client_error_send(client, rid, CSERVE2_FILE_CHANGED); return; @@ -1051,33 +1134,32 @@ DBG("Loading image id: %d", ref->entry->id); - entry = ref->entry; - // File already being loaded, just add the request to be replied - if (entry->request) + if (entry->base.request) { - _request_answer_add(entry->request, ref, rid, CSERVE2_LOAD); - if ((!entry->request->processing) && (!entry->image.doload)) + _request_answer_add(entry->base.request, ref, rid, CSERVE2_LOAD); + if ((!entry->base.request->processing) && (!entry->doload)) { DBG("Removing entry %d from speculative preload and adding " - "to normal load queue.", entry->id); + "to normal load queue.", entry->base.id); spload_requests = eina_list_remove(spload_requests, - entry->request); - load_requests = eina_list_append(load_requests, entry->request); + entry->base.request); + load_requests = eina_list_append(load_requests, + entry->base.request); } } - else if (entry->image.shm) + else if (entry->shm) _image_loaded_send(client, entry, rid); else - _request_add(&load_requests, entry, ref, rid, CSERVE2_LOAD); + _request_add(&load_requests, (Entry *)entry, ref, rid, CSERVE2_LOAD); - entry->image.doload = EINA_TRUE; + entry->doload = EINA_TRUE; } void cserve2_cache_image_preload(Client *client, unsigned int client_image_id, unsigned int rid) { - Entry *entry; + Image_Data *entry; Reference *ref; ref = eina_hash_find(client->images.referencing, &client_image_id); @@ -1087,7 +1169,10 @@ client->id, client_image_id); return; } - if (ref->entry->image.file->file.invalid) + + entry = (Image_Data *)ref->entry; + + if (entry->file->invalid) { cserve2_client_error_send(client, rid, CSERVE2_FILE_CHANGED); return; @@ -1095,27 +1180,26 @@ DBG("Loading image id: %d", ref->entry->id); - entry = ref->entry; - // File already being loaded, just add the request to be replied - if (entry->request) + if (entry->base.request) { - _request_answer_add(entry->request, ref, rid, CSERVE2_PRELOAD); - if ((!entry->request->processing) && (!entry->image.doload)) + _request_answer_add(entry->base.request, ref, rid, CSERVE2_PRELOAD); + if ((!entry->base.request->processing) && (!entry->doload)) { DBG("Removing entry %d from speculative preload and adding " - "to normal (pre)load queue.", entry->id); + "to normal (pre)load queue.", entry->base.id); spload_requests = eina_list_remove(spload_requests, - entry->request); - load_requests = eina_list_append(load_requests, entry->request); + entry->base.request); + load_requests = eina_list_append(load_requests, + entry->base.request); } } - else if (entry->image.shm) + else if (entry->shm) _image_preloaded_send(client, rid); else - _request_add(&load_requests, entry, ref, rid, CSERVE2_PRELOAD); + _request_add(&load_requests, (Entry *)entry, ref, rid, CSERVE2_PRELOAD); - entry->image.doload = EINA_TRUE; + entry->doload = EINA_TRUE; } void @@ -1136,126 +1220,32 @@ } void -cserve2_cache_request_opened(Slave_Msg_Image_Opened *resp, void *data) +cserve2_cache_requests_response(Slave_Command type, void *msg, void *data) { - Waiter *w; Request *req = data; - Entry *entry; - entry = req->entry; - if (!entry) + if (!req->entry) { - Error_Type err = entry->file.invalid - ? CSERVE2_FILE_CHANGED - : CSERVE2_REQUEST_CANCEL; - DBG("File entry for request doesn't exist anymore."); - cserve2_cache_request_failed(req, err); - entry->request = NULL; - return; - } + Waiter *w; + DBG("Request finished but it has no entry anymore."); + EINA_LIST_FREE(req->waiters, w) + { + cserve2_client_error_send(w->ref->client, w->rid, + CSERVE2_REQUEST_CANCEL); - entry->request = NULL; - - entry->file.w = resp->w; - entry->file.h = resp->h; - entry->file.frame_count = resp->frame_count; - entry->file.loop_count = resp->loop_count; - entry->file.loop_hint = resp->loop_hint; - entry->file.alpha = resp->alpha; - if (resp->has_loader_data) - { - const char *ldata = (const char *)resp + - sizeof(Slave_Msg_Image_Opened); - entry->file.loader_data = eina_stringshare_add(ldata); + w->ref->count--; + free(w); + } } - - DBG("Finished opening file %d. Notifying %d waiters.", entry->id, - req->waiters ? eina_list_count(req->waiters) : 0); - EINA_LIST_FREE(req->waiters, w) + else if (type == ERROR) { - _image_opened_send(w->ref->client, entry, w->rid); - free(w); + Error_Type *error = msg; + req->funcs->error(req->entry, *error); } + else + req->funcs->response(req->entry, msg); + if (req->entry) + req->entry->request = NULL; free(req); } - -void -cserve2_cache_request_loaded(Slave_Msg_Image_Loaded *resp, void *data) -{ - Waiter *w; - Request *req = data; - Entry *entry; - - entry = req->entry; - if (!entry) - { - // FIXME: Wouldn't we keep the entry alive when the file changed - // until we send the errors needed and just then delete it? Right now - // the check below just makes no sense. - // Error_Type err = entry->image.file->file.invalid - // ? CSERVE2_FILE_CHANGED - // : CSERVE2_REQUEST_CANCEL; - DBG("Image entry for request doesn't exist anymore."); - cserve2_cache_request_failed(req, CSERVE2_REQUEST_CANCEL); - entry->request = NULL; - return; - } - - entry->request = NULL; - entry->image.alpha_sparse = resp->alpha_sparse; - if (!entry->image.doload) - DBG("Entry %d loaded by speculative preload.", entry->id); - - DBG("Finished loading image %d. Notifying %d waiters.", entry->id, - req->waiters ? eina_list_count(req->waiters) : 0); - EINA_LIST_FREE(req->waiters, w) - { - if (w->type == CSERVE2_LOAD) - _image_loaded_send(w->ref->client, entry, w->rid); - else if (w->type == CSERVE2_PRELOAD) - _image_preloaded_send(w->ref->client, w->rid); - // else w->type == CSERVE2_SETOPTS --> do nothing - - free(w); - } - - free(req); -} - -void -cserve2_cache_request_failed(void *data, Error_Type type) -{ - Waiter *w; - Request *req = data; - Entry *entry; - Eina_List *l; - Reference *ref; - - DBG("Request for entry %p failed with error %d", req->entry, type); - EINA_LIST_FREE(req->waiters, w) - { - cserve2_client_error_send(w->ref->client, w->rid, type); - - w->ref->count--; - free(w); - } - - entry = req->entry; - if (!entry) - goto free_req; - - EINA_LIST_FOREACH(entry->references, l, ref) - { - Eina_Hash *hash = NULL; - if (entry->type == CSERVE2_IMAGE_FILE) - hash = ref->client->files.referencing; - else if (entry->type == CSERVE2_IMAGE_DATA) - hash = ref->client->images.referencing; - - eina_hash_del_by_key(hash, &(ref->client_entry_id)); - } - -free_req: - free(req); -} Modified: trunk/evas/src/bin/evas_cserve2_main.c =================================================================== --- trunk/evas/src/bin/evas_cserve2_main.c 2012-05-23 10:56:17 UTC (rev 71355) +++ trunk/evas/src/bin/evas_cserve2_main.c 2012-05-23 17:13:46 UTC (rev 71356) @@ -87,21 +87,13 @@ slaves_working = eina_inlist_remove(slaves_working, EINA_INLIST_GET(sw)); if (!sw->done) - cserve2_cache_request_failed(sw->data, CSERVE2_LOADER_DIED); + cserve2_cache_requests_response(ERROR, (Error_Type[]){ CSERVE2_LOADER_DIED }, sw->data); if (sw->ret) eina_binbuf_free(sw->ret); free(sw); } static void -_slave_read_error(Slave_Worker *sw, void *msg) -{ - Error_Type *error = msg; - - cserve2_cache_request_failed(sw->data, *error); -} - -static void _slave_read_cb(Slave_Proc *s __UNUSED__, Slave_Command cmd, void *msg, void *data) { Slave_Worker *sw = data; @@ -110,19 +102,15 @@ switch (cmd) { case IMAGE_OPEN: - cserve2_cache_request_opened(msg, sw->data); - sw->done = EINA_TRUE; - break; case IMAGE_LOAD: - cserve2_cache_request_loaded(msg, sw->data); sw->done = EINA_TRUE; break; case ERROR: - _slave_read_error(sw, msg); break; default: ERR("Unrecognized command received from slave: %d", cmd); } + cserve2_cache_requests_response(cmd, msg, sw->data); free(msg); // slave finishes its work, put it back to idle list @@ -175,7 +163,7 @@ if (!sw->slave) { ERR("Could not launch slave process"); - cserve2_cache_request_failed(data, CSERVE2_LOADER_EXEC_ERR); + cserve2_cache_requests_response(ERROR, (Error_Type[]){ CSERVE2_LOADER_EXEC_ERR }, sw->data); free(sw); return EINA_FALSE; } |
From: Enlightenment S. <no-...@en...> - 2012-06-22 22:38:35
|
Log: Fix generation of FONT_DEBUG response Author: sachiel Date: 2012-06-22 15:38:28 -0700 (Fri, 22 Jun 2012) New Revision: 72707 Trac: http://trac.enlightenment.org/e/changeset/72707 Modified: trunk/evas/src/bin/evas_cserve2_cache.c Modified: trunk/evas/src/bin/evas_cserve2_cache.c =================================================================== --- trunk/evas/src/bin/evas_cserve2_cache.c 2012-06-22 22:12:15 UTC (rev 72706) +++ trunk/evas/src/bin/evas_cserve2_cache.c 2012-06-22 22:38:28 UTC (rev 72707) @@ -1871,7 +1871,8 @@ static Eina_Bool _font_entry_debug_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata) { - char *buf = fdata; + char **pos = fdata; + char *buf = *pos; Font_Entry *fe = data; Font_Cache *fc; unsigned int len; @@ -1964,6 +1965,7 @@ } } + *pos = buf; return EINA_TRUE; } @@ -1974,6 +1976,7 @@ char *buf, *pos; struct _debug_info di; di.size = sizeof(msg); + di.nfonts = 0; memset(&msg, 0, sizeof(msg)); @@ -2000,7 +2003,7 @@ memcpy(pos, &di.nfonts, sizeof(unsigned int)); pos += sizeof(unsigned int); - eina_hash_foreach(font_entries, _font_entry_debug_cb, pos); + eina_hash_foreach(font_entries, _font_entry_debug_cb, &pos); *size = di.size; return buf; |
From: Enlightenment S. <no-...@en...> - 2012-06-22 22:39:23
|
Log: Add simple debug client for cserve2 Author: sachiel Date: 2012-06-22 15:39:16 -0700 (Fri, 22 Jun 2012) New Revision: 72708 Trac: http://trac.enlightenment.org/e/changeset/72708 Added: trunk/evas/src/bin/evas_cserve2_debug.c Modified: trunk/evas/src/bin/Makefile.am Modified: trunk/evas/src/bin/Makefile.am =================================================================== --- trunk/evas/src/bin/Makefile.am 2012-06-22 22:38:28 UTC (rev 72707) +++ trunk/evas/src/bin/Makefile.am 2012-06-22 22:39:16 UTC (rev 72708) @@ -45,7 +45,7 @@ SUBDIRS = loaders libexec_PROGRAMS = evas_cserve2 evas_cserve2_slave dummy_slave -bin_PROGRAMS = evas_cserve2_client evas_cserve2_usage +bin_PROGRAMS = evas_cserve2_client evas_cserve2_usage evas_cserve2_debug AM_CPPFLAGS = \ -I. \ @@ -86,9 +86,15 @@ evas_cserve2_usage_SOURCES = \ evas_cserve2_usage.c +evas_cserve2_debug_SOURCES = \ +evas_cserve2_debug.c + evas_cserve2_usage_LDADD = \ @EINA_LIBS@ +evas_cserve2_debug_LDADD = \ +@EINA_LIBS@ + evas_cserve2_slave_SOURCES = \ evas_cserve2_slave.c \ evas_cserve2_utils.c |
From: Enlightenment S. <no-...@en...> - 2012-06-25 17:43:05
|
Log: Re-enable the used glyphs message now that it doesn't crash or leak Author: sachiel Date: 2012-06-25 10:42:58 -0700 (Mon, 25 Jun 2012) New Revision: 72819 Trac: http://trac.enlightenment.org/e/changeset/72819 Modified: trunk/evas/src/bin/evas_cserve2_cache.c trunk/evas/src/bin/evas_cserve2_main.c Modified: trunk/evas/src/bin/evas_cserve2_cache.c =================================================================== --- trunk/evas/src/bin/evas_cserve2_cache.c 2012-06-25 17:18:08 UTC (rev 72818) +++ trunk/evas/src/bin/evas_cserve2_cache.c 2012-06-25 17:42:58 UTC (rev 72819) @@ -2508,7 +2508,7 @@ return 0; } - _glyphs_load_request_prepare(req); + _glyphs_request_check(req); groups = _glyphs_group_create(req); // Promote SHMs which are still cached and in use @@ -2518,6 +2518,7 @@ { _font_shm_promote(gg->fc); eina_list_free(gg->glyphs); + free(gg); } _glyphs_request_free(req); Modified: trunk/evas/src/bin/evas_cserve2_main.c =================================================================== --- trunk/evas/src/bin/evas_cserve2_main.c 2012-06-25 17:18:08 UTC (rev 72818) +++ trunk/evas/src/bin/evas_cserve2_main.c 2012-06-25 17:42:58 UTC (rev 72819) @@ -316,13 +316,11 @@ { INF("Received CSERVE2_FONT_GLYPHS_USED command: RID=%d", msg->base.rid); - /* cserve2_cache_font_glyphs_used(client, source, msg->sourcelen, fontpath, msg->pathlen, msg->hint, msg->rend_flags, msg->size, msg->dpi, glyphs, msg->nglyphs, msg->base.rid); - */ } } |
From: Enlightenment S. <no-...@en...> - 2012-06-25 19:28:07
|
Log: Don't free file entries while there are still images pending from them Author: sachiel Date: 2012-06-25 12:27:59 -0700 (Mon, 25 Jun 2012) New Revision: 72826 Trac: http://trac.enlightenment.org/e/changeset/72826 Modified: trunk/evas/src/bin/evas_cserve2_cache.c Modified: trunk/evas/src/bin/evas_cserve2_cache.c =================================================================== --- trunk/evas/src/bin/evas_cserve2_cache.c 2012-06-25 19:05:59 UTC (rev 72825) +++ trunk/evas/src/bin/evas_cserve2_cache.c 2012-06-25 19:27:59 UTC (rev 72826) @@ -596,7 +596,11 @@ } if (fentry) - fentry->images = eina_list_remove(fentry->images, entry); + { + fentry->images = eina_list_remove(fentry->images, entry); + if (!fentry->images && !fentry->base.references) + eina_hash_del_by_key(file_entries, &fentry->base.id); + } if (entry->shm) cserve2_shm_unref(entry->shm); free(entry); @@ -1069,13 +1073,10 @@ if (fentry->invalid) _file_entry_free(fentry); - else - { - Image_Data *ie; - EINA_LIST_FREE(fentry->images, ie) - ie->file = NULL; - eina_hash_del_by_key(file_entries, &entry->id); - } + else if (!fentry->images) + eina_hash_del_by_key(file_entries, &entry->id); + /* don't free file entries that have images attached to it, they will + * be freed when the last unused image is freed */ } else if (entry->type == CSERVE2_IMAGE_DATA) { |
From: Enlightenment S. <no-...@en...> - 2012-06-27 19:01:26
|
Log: Prevent using freed data in epoll events Author: sachiel Date: 2012-06-27 12:01:16 -0700 (Wed, 27 Jun 2012) New Revision: 72960 Trac: http://trac.enlightenment.org/e/changeset/72960 Modified: trunk/evas/src/bin/evas_cserve2_main_loop_linux.c Modified: trunk/evas/src/bin/evas_cserve2_main_loop_linux.c =================================================================== --- trunk/evas/src/bin/evas_cserve2_main_loop_linux.c 2012-06-27 18:54:33 UTC (rev 72959) +++ trunk/evas/src/bin/evas_cserve2_main_loop_linux.c 2012-06-27 19:01:16 UTC (rev 72960) @@ -26,6 +26,7 @@ Fd_Flags flags; Fd_Watch_Cb callback; const void *user_data; + Eina_Bool deleted : 1; }; typedef struct _Watch_Data Watch_Data; @@ -47,6 +48,7 @@ static int inotify_fd = -1; static struct sockaddr_un socket_local; static Eina_Hash *watch_list; +static Eina_List *deleted_watch_list; static Eina_Hash *inotify_path_hash; static Eina_Hash *inotify_id_hash; static Eina_Bool running; @@ -354,7 +356,9 @@ static void _watch_data_free_cb(void *data) { - free(data); + Watch_Data *wd = data; + wd->deleted = EINA_TRUE; + deleted_watch_list = eina_list_append(deleted_watch_list, wd); } Eina_Bool @@ -444,6 +448,8 @@ void cserve2_main_loop_finish(void) { + Watch_Data *wd; + _socketfd_finish(); _signalfd_finish(); @@ -451,6 +457,8 @@ _inotifyfd_finish(); eina_hash_free(watch_list); + EINA_LIST_FREE(deleted_watch_list, wd) + free(wd); close(epoll_fd); } @@ -726,6 +734,7 @@ { struct epoll_event events[MAX_EPOLL_EVENTS]; int n, nfds; + Watch_Data *data; if (terminate) break; @@ -748,12 +757,15 @@ for (n = 0; n < nfds; n++) { - Watch_Data *data = events[n].data.ptr; + data = events[n].data.ptr; Fd_Flags flags = 0; if (!data) continue; + if (data->deleted) + continue; + if (!data->callback) continue; @@ -766,6 +778,9 @@ data->callback(data->fd, flags, (void *)data->user_data); } + EINA_LIST_FREE(deleted_watch_list, data) + free(data); + _update_timeout(); } |
From: Enlightenment S. <no-...@en...> - 2012-06-27 19:01:47
|
Log: Mark the slave as not done when it starts a job Author: sachiel Date: 2012-06-27 12:01:40 -0700 (Wed, 27 Jun 2012) New Revision: 72961 Trac: http://trac.enlightenment.org/e/changeset/72961 Modified: trunk/evas/src/bin/evas_cserve2_main.c Modified: trunk/evas/src/bin/evas_cserve2_main.c =================================================================== --- trunk/evas/src/bin/evas_cserve2_main.c 2012-06-27 19:01:16 UTC (rev 72960) +++ trunk/evas/src/bin/evas_cserve2_main.c 2012-06-27 19:01:40 UTC (rev 72961) @@ -147,6 +147,7 @@ EINA_INLIST_GET(sw)); sw->data = data; + sw->done = EINA_FALSE; DBG("Dispatching command '%d' to slave '%p'", cmd, sw->slave); cserve2_slave_send(sw->slave, cmd, msg, size); return EINA_TRUE; |
From: Enlightenment S. <no-...@en...> - 2012-06-29 22:04:04
|
Log: Add support for a request to depend on another Author: sachiel Date: 2012-06-29 15:03:57 -0700 (Fri, 29 Jun 2012) New Revision: 73058 Trac: http://trac.enlightenment.org/e/changeset/73058 Modified: trunk/evas/src/bin/evas_cserve2.h trunk/evas/src/bin/evas_cserve2_cache.c trunk/evas/src/bin/evas_cserve2_requests.c Modified: trunk/evas/src/bin/evas_cserve2.h =================================================================== --- trunk/evas/src/bin/evas_cserve2.h 2012-06-29 21:55:37 UTC (rev 73057) +++ trunk/evas/src/bin/evas_cserve2.h 2012-06-29 22:03:57 UTC (rev 73058) @@ -288,7 +288,7 @@ void cserve2_cache_font_debug(Client *client, unsigned int rid); -Font_Request *cserve2_request_add(Font_Request_Type type, unsigned int rid, Client *client, Font_Request_Funcs *funcs, void *data); +Font_Request *cserve2_request_add(Font_Request_Type type, unsigned int rid, Client *client, Font_Request *dep, Font_Request_Funcs *funcs, void *data); void cserve2_request_waiter_add(Font_Request *req, unsigned int rid, Client *client); void cserve2_request_cancel(Font_Request *req, Client *client, Error_Type err); void cserve2_request_cancel_all(Font_Request *req, Error_Type err); Modified: trunk/evas/src/bin/evas_cserve2_cache.c =================================================================== --- trunk/evas/src/bin/evas_cserve2_cache.c 2012-06-29 21:55:37 UTC (rev 73057) +++ trunk/evas/src/bin/evas_cserve2_cache.c 2012-06-29 22:03:57 UTC (rev 73058) @@ -2460,7 +2460,7 @@ fs->references++; DBG("adding FONT_LOAD '%s' request.", fs->name); fe->request = cserve2_request_add(CSERVE2_REQ_FONT_LOAD, rid, - client, &_font_load_funcs, fe); + client, NULL, &_font_load_funcs, fe); eina_hash_direct_add(font_entries, fe, fe); @@ -2518,7 +2518,7 @@ else { cserve2_request_add(CSERVE2_REQ_FONT_GLYPHS_LOAD, rid, - client, &_glyphs_load_funcs, req); + client, req->fe->request, &_glyphs_load_funcs, req); } return 0; } Modified: trunk/evas/src/bin/evas_cserve2_requests.c =================================================================== --- trunk/evas/src/bin/evas_cserve2_requests.c 2012-06-29 21:55:37 UTC (rev 73057) +++ trunk/evas/src/bin/evas_cserve2_requests.c 2012-06-29 22:03:57 UTC (rev 73058) @@ -68,6 +68,9 @@ Eina_List *waiters; Eina_Bool processing; Font_Request_Funcs *funcs; + Font_Request *dependency; + Eina_List *dependents; /* list of requests that depend on this one finishing */ + Eina_Bool locked : 1; /* locked waiting for a dependency request to finish */ }; struct _Waiter @@ -105,7 +108,7 @@ } Font_Request * -cserve2_request_add(Font_Request_Type type, unsigned int rid, Client *client, Font_Request_Funcs *funcs __UNUSED__, void *data) +cserve2_request_add(Font_Request_Type type, unsigned int rid, Client *client, Font_Request *dep, Font_Request_Funcs *funcs, void *data) { Font_Request *req, *r; @@ -138,7 +141,7 @@ if (!req) { DBG("Add request for rid: %d", rid); - req = malloc(sizeof(*req)); + req = calloc(1, sizeof(*req)); req->type = type; req->data = data; req->waiters = NULL; @@ -148,6 +151,13 @@ EINA_INLIST_GET(req)); } + if (dep && !req->dependency) + { + req->locked = EINA_TRUE; + dep->dependents = eina_list_append(dep->dependents, req); + req->dependency = dep; + } + _request_waiter_add(req, client, rid); _cserve2_requests_process(); @@ -161,6 +171,21 @@ _request_waiter_add(req, client, rid); } +static void +_request_dependents_cancel(Font_Request *req, Error_Type err) +{ + Font_Request *dep; + + EINA_LIST_FREE(req->dependents, dep) + { + dep->locked = EINA_FALSE; + dep->dependency = NULL; + /* Maybe we need a better way to inform the creator of the request + * that it was cancelled because its dependency failed? */ + cserve2_request_cancel_all(dep, err); + } +} + void cserve2_request_cancel(Font_Request *req, Client *client, Error_Type err) { @@ -180,6 +205,12 @@ } } + if (req->dependency) + req->dependency->dependents = eina_list_remove( + req->dependency->dependents, req); + + _request_dependents_cancel(req, err); + // TODO: When we have speculative preload, there may be no waiters, // so we need a flag or something else to make things still load. if ((!req->waiters) && (!req->processing)) @@ -210,9 +241,15 @@ free(w); } + _request_dependents_cancel(req, err); + if (req->processing) return; + if (req->dependency) + req->dependency->dependents = eina_list_remove( + req->dependency->dependents, req); + requests[req->type].waiting = eina_inlist_remove( requests[req->type].waiting, EINA_INLIST_GET(req)); req->funcs->msg_free(req->msg, req->data); @@ -247,6 +284,9 @@ req->funcs->msg_free(req->msg, req->data); requests[req->type].processing = eina_inlist_remove( requests[req->type].processing, EINA_INLIST_GET(req)); + + _request_dependents_cancel(req, type); + free(req); } @@ -254,7 +294,7 @@ _slave_read_cb(Slave *s __UNUSED__, Slave_Command cmd, void *msg, void *data) { Slave_Worker *sw = data; - Font_Request *req = sw->data; + Font_Request *dep, *req = sw->data; Eina_List **working, **idle; Waiter *w; @@ -276,6 +316,13 @@ free(msg); requests[req->type].processing = eina_inlist_remove( requests[req->type].processing, EINA_INLIST_GET(req)); + + EINA_LIST_FREE(req->dependents, dep) + { + dep->locked = EINA_FALSE; + dep->dependency = NULL; + } + free(req); sw->data = NULL; @@ -416,6 +463,9 @@ Font_Request *req = EINA_INLIST_CONTAINER_GET( requests[rtype].waiting, Font_Request); + if (req->locked) + continue; + requests[rtype].waiting = eina_inlist_remove( requests[rtype].waiting, requests[rtype].waiting); requests[rtype].processing = eina_inlist_append( |
From: Enlightenment S. <no-...@en...> - 2012-06-29 22:04:30
|
Log: THE MOST IMPORTANT COMMIT IN THE HISTORY OF HUMANITY Author: sachiel Date: 2012-06-29 15:04:23 -0700 (Fri, 29 Jun 2012) New Revision: 73060 Trac: http://trac.enlightenment.org/e/changeset/73060 Modified: trunk/evas/src/bin/evas_cserve2_requests.c Modified: trunk/evas/src/bin/evas_cserve2_requests.c =================================================================== --- trunk/evas/src/bin/evas_cserve2_requests.c 2012-06-29 22:04:13 UTC (rev 73059) +++ trunk/evas/src/bin/evas_cserve2_requests.c 2012-06-29 22:04:23 UTC (rev 73060) @@ -492,7 +492,6 @@ *idle = eina_list_remove_list(*idle, *idle); *working = eina_list_append(*working, sw); - } } } |
From: Enlightenment S. <no-...@en...> - 2012-06-29 22:04:40
|
Log: Let's not fall into an infinite loop with blocked requests Author: sachiel Date: 2012-06-29 15:04:34 -0700 (Fri, 29 Jun 2012) New Revision: 73061 Trac: http://trac.enlightenment.org/e/changeset/73061 Modified: trunk/evas/src/bin/evas_cserve2_requests.c Modified: trunk/evas/src/bin/evas_cserve2_requests.c =================================================================== --- trunk/evas/src/bin/evas_cserve2_requests.c 2012-06-29 22:04:23 UTC (rev 73060) +++ trunk/evas/src/bin/evas_cserve2_requests.c 2012-06-29 22:04:34 UTC (rev 73061) @@ -432,6 +432,8 @@ Slave_Command ctype; unsigned int max_workers; Eina_List **idle, **working; + Eina_Inlist *itr; + Font_Request *req; for (j = 0; _request_match[j].rtype != CSERVE2_REQ_LAST; j++) { @@ -456,13 +458,13 @@ idle = &_workers[type].idle; working = &_workers[type].working; - while (requests[rtype].waiting && - (eina_list_count(*working) < max_workers)) + EINA_INLIST_FOREACH_SAFE(requests[rtype].waiting, itr, req) { Slave_Worker *sw; - Font_Request *req = EINA_INLIST_CONTAINER_GET( - requests[rtype].waiting, Font_Request); + if (eina_list_count(*working) >= max_workers) + break; + if (req->locked) continue; |
From: Enlightenment S. <no-...@en...> - 2012-06-29 22:04:48
|
Log: Remove the right element from the list Author: sachiel Date: 2012-06-29 15:04:42 -0700 (Fri, 29 Jun 2012) New Revision: 73062 Trac: http://trac.enlightenment.org/e/changeset/73062 Modified: trunk/evas/src/bin/evas_cserve2_requests.c Modified: trunk/evas/src/bin/evas_cserve2_requests.c =================================================================== --- trunk/evas/src/bin/evas_cserve2_requests.c 2012-06-29 22:04:34 UTC (rev 73061) +++ trunk/evas/src/bin/evas_cserve2_requests.c 2012-06-29 22:04:42 UTC (rev 73062) @@ -469,7 +469,7 @@ continue; requests[rtype].waiting = eina_inlist_remove( - requests[rtype].waiting, requests[rtype].waiting); + requests[rtype].waiting, EINA_INLIST_GET(req)); requests[rtype].processing = eina_inlist_append( requests[rtype].processing, EINA_INLIST_GET(req)); |
From: Enlightenment S. <no-...@en...> - 2012-07-17 14:22:53
|
Log: Call the requests callbacks only once per request Message creation was like that already, but now we call the response or error callback for the request only once. The cache does what it needs there and returns, in the case of a successful response, the message that will be sent to the client. Author: sachiel Date: 2012-07-17 07:22:42 -0700 (Tue, 17 Jul 2012) New Revision: 73981 Trac: http://trac.enlightenment.org/e/changeset/73981 Modified: trunk/evas/src/bin/evas_cserve2.h trunk/evas/src/bin/evas_cserve2_cache.c trunk/evas/src/bin/evas_cserve2_requests.c Modified: trunk/evas/src/bin/evas_cserve2.h =================================================================== --- trunk/evas/src/bin/evas_cserve2.h 2012-07-17 14:11:38 UTC (rev 73980) +++ trunk/evas/src/bin/evas_cserve2.h 2012-07-17 14:22:42 UTC (rev 73981) @@ -189,8 +189,8 @@ typedef void *(*Font_Request_Msg_Create)(void *data, int *size); typedef void (*Font_Request_Msg_Free)(void *msg, void *data); -typedef void (*Font_Request_Response)(Client *c, void *data, void *resp, unsigned int rid); -typedef void (*Font_Request_Error)(Client *c, void *data, Error_Type error, unsigned int rid); +typedef Msg_Base *(*Font_Request_Response)(void *data, void *resp, int *size); +typedef void (*Font_Request_Error)(void *data, Error_Type error); struct _Font_Request_Funcs { Font_Request_Msg_Create msg_create; Modified: trunk/evas/src/bin/evas_cserve2_cache.c =================================================================== --- trunk/evas/src/bin/evas_cserve2_cache.c 2012-07-17 14:11:38 UTC (rev 73980) +++ trunk/evas/src/bin/evas_cserve2_cache.c 2012-07-17 14:22:42 UTC (rev 73981) @@ -1336,14 +1336,11 @@ free(msg); } -static void -_font_load_request_response(Client *client __UNUSED__, void *data, void *resp, unsigned int rid __UNUSED__) +static Msg_Font_Loaded * +_font_load_request_response(Font_Entry *fe, Slave_Msg_Font_Loaded *msg, int *size) { - Slave_Msg_Font_Loaded *msg = resp; - Font_Entry *fe = data; + Msg_Font_Loaded *resp; - DBG("request %d answered.", rid); - if (!fe->src->ft) fe->src->ft = msg->ftdata1; @@ -1355,20 +1352,24 @@ if (fe->request) fe->request = NULL; - _font_loaded_send(client, rid); + /* could be a function, but it's too basic and only used here */ + resp = calloc(1, sizeof(*resp)); + resp->base.type = CSERVE2_FONT_LOADED; + *size = sizeof(*resp); + + return resp; } static void -_font_load_request_failed(Client *client __UNUSED__, void *data __UNUSED__, Error_Type error __UNUSED__, unsigned int rid __UNUSED__) +_font_load_request_failed(Font_Entry *fe, Error_Type error __UNUSED__) { - Font_Entry *fe = data; - DBG("request %d error answered.", rid); + Eina_List *l; + Reference *ref; - cserve2_client_error_send(client, rid, error); - if (fe->request) fe->request = NULL; - _font_entry_reference_del(client, fe); + EINA_LIST_FOREACH(fe->base.references, l, ref) + _font_entry_reference_del(ref->client, fe); } static Font_Request_Funcs _font_load_funcs = { @@ -1447,8 +1448,8 @@ return groups; } -static void -_glyphs_loaded_send(Glyphs_Request *req, unsigned int rid) +static Msg_Font_Glyphs_Loaded * +_glyphs_loaded_msg_create(Glyphs_Request *req, int *resp_size) { Msg_Font_Glyphs_Loaded msg; unsigned int size; @@ -1460,7 +1461,6 @@ Glyphs_Group *iter; memset(&msg, 0, sizeof(msg)); - msg.base.rid = rid; msg.base.type = CSERVE2_FONT_GLYPHS_LOADED; answers = _glyphs_group_create(req); @@ -1536,6 +1536,20 @@ free(iter); } + *resp_size = size; + + return (Msg_Font_Glyphs_Loaded *)resp; +} + +static void +_glyphs_loaded_send(Glyphs_Request *req, unsigned int rid) +{ + Msg_Font_Glyphs_Loaded *resp; + int size; + + resp = _glyphs_loaded_msg_create(req, &size); + resp->base.rid = rid; + cserve2_client_send(req->client, &size, sizeof(size)); cserve2_client_send(req->client, resp, size); @@ -1695,11 +1709,9 @@ free(msg); } -static void -_glyphs_load_request_response(Client *client __UNUSED__, void *data, void *resp, unsigned int rid) +static Msg_Font_Glyphs_Loaded * +_glyphs_load_request_response(Glyphs_Request *req, Slave_Msg_Font_Glyphs_Loaded *msg, int *size) { - Glyphs_Request *req = data; - Slave_Msg_Font_Glyphs_Loaded *msg = resp; Font_Entry *fe = req->fe; Font_Cache *fc = NULL; unsigned int i = 0; @@ -1762,12 +1774,13 @@ fe->gl_slave_time += msg->gl_slave_time; #endif - _glyphs_loaded_send(req, rid); _font_shm_lru_flush(); + + return _glyphs_loaded_msg_create(req, size); } static void -_glyphs_load_request_failed(Client *client __UNUSED__, void *data __UNUSED__, Error_Type error __UNUSED__, unsigned int rid __UNUSED__) +_glyphs_load_request_failed(void *data __UNUSED__, Error_Type error __UNUSED__) { } Modified: trunk/evas/src/bin/evas_cserve2_requests.c =================================================================== --- trunk/evas/src/bin/evas_cserve2_requests.c 2012-07-17 14:11:38 UTC (rev 73980) +++ trunk/evas/src/bin/evas_cserve2_requests.c 2012-07-17 14:22:42 UTC (rev 73981) @@ -192,14 +192,16 @@ Eina_List *l, *l_next; Waiter *w; + if (req->funcs && req->funcs->error) + req->funcs->error(req->data, err); + EINA_LIST_FOREACH_SAFE(req->waiters, l, l_next, w) { if (w->client->id == client->id) { DBG("Removing answer from waiter client: %d, rid: %d", client->id, w->rid); - if (req->funcs && req->funcs->error) - req->funcs->error(client, req->data, err, w->rid); + cserve2_client_error_send(w->client, w->rid, err); req->waiters = eina_list_remove_list(req->waiters, l); free(w); } @@ -232,12 +234,14 @@ DBG("Removing all answers."); + if (req->funcs && req->funcs->error) + req->funcs->error(req->data, err); + EINA_LIST_FREE(req->waiters, w) { DBG("Removing answer from waiter client: %d, rid: %d", w->client->id, w->rid); - if (req->funcs && req->funcs->error) - req->funcs->error(w->client, req->data, err, w->rid); + cserve2_client_error_send(w->client, w->rid, err); free(w); } @@ -275,9 +279,11 @@ { Waiter *w; + req->funcs->error(req->data, type); + EINA_LIST_FREE(req->waiters, w) { - req->funcs->error(w->client, req->data, type, w->rid); + cserve2_client_error_send(w->client, w->rid, type); free(w); } @@ -297,19 +303,35 @@ Font_Request *dep, *req = sw->data; Eina_List **working, **idle; Waiter *w; + Msg_Base *resp = NULL; + int resp_size; + if (cmd == ERROR) + { + Error_Type *err = msg; + req->funcs->error(req->data, *err); + } + else + resp = req->funcs->response(req->data, msg, &resp_size); + EINA_LIST_FREE(req->waiters, w) { if (cmd == ERROR) { Error_Type *err = msg; - req->funcs->error(w->client, req->data, *err, w->rid); + cserve2_client_error_send(w->client, w->rid, *err); } else - req->funcs->response(w->client, req->data, msg, w->rid); + { + resp->rid = w->rid; + cserve2_client_send(w->client, &resp_size, sizeof(resp_size)); + cserve2_client_send(w->client, resp, resp_size); + } free(w); } + free(resp); + req->funcs->msg_free(req->msg, req->data); // FIXME: We shouldn't free this message directly, it must be freed by a // callback. |
From: Enlightenment S. <no-...@en...> - 2012-07-17 14:23:01
|
Log: Cancel dependents only when the request itself is cancelled Author: sachiel Date: 2012-07-17 07:22:52 -0700 (Tue, 17 Jul 2012) New Revision: 73982 Trac: http://trac.enlightenment.org/e/changeset/73982 Modified: trunk/evas/src/bin/evas_cserve2_requests.c Modified: trunk/evas/src/bin/evas_cserve2_requests.c =================================================================== --- trunk/evas/src/bin/evas_cserve2_requests.c 2012-07-17 14:22:42 UTC (rev 73981) +++ trunk/evas/src/bin/evas_cserve2_requests.c 2012-07-17 14:22:52 UTC (rev 73982) @@ -207,12 +207,6 @@ } } - if (req->dependency) - req->dependency->dependents = eina_list_remove( - req->dependency->dependents, req); - - _request_dependents_cancel(req, err); - // TODO: When we have speculative preload, there may be no waiters, // so we need a flag or something else to make things still load. if ((!req->waiters) && (!req->processing)) @@ -222,6 +216,13 @@ // TODO: If the request is being processed, it can't be deleted. Must // be marked as delete_me instead. req->funcs->msg_free(req->msg, req->data); + + if (req->dependency) + req->dependency->dependents = eina_list_remove( + req->dependency->dependents, req); + + _request_dependents_cancel(req, err); + free(req); } |
From: Enlightenment S. <no-...@en...> - 2012-07-17 14:23:08
|
Log: Allow creating requets without a client waiting on it Author: sachiel Date: 2012-07-17 07:22:57 -0700 (Tue, 17 Jul 2012) New Revision: 73983 Trac: http://trac.enlightenment.org/e/changeset/73983 Modified: trunk/evas/src/bin/evas_cserve2_requests.c Modified: trunk/evas/src/bin/evas_cserve2_requests.c =================================================================== --- trunk/evas/src/bin/evas_cserve2_requests.c 2012-07-17 14:22:52 UTC (rev 73982) +++ trunk/evas/src/bin/evas_cserve2_requests.c 2012-07-17 14:22:57 UTC (rev 73983) @@ -158,7 +158,8 @@ req->dependency = dep; } - _request_waiter_add(req, client, rid); + if (client && rid) + _request_waiter_add(req, client, rid); _cserve2_requests_process(); |
From: Enlightenment S. <no-...@en...> - 2012-07-17 14:23:29
|
Log: Rename Font_Request so I stop being stupidly confused by it. Author: sachiel Date: 2012-07-17 07:23:19 -0700 (Tue, 17 Jul 2012) New Revision: 73985 Trac: http://trac.enlightenment.org/e/changeset/73985 Modified: trunk/evas/src/bin/evas_cserve2.h trunk/evas/src/bin/evas_cserve2_cache.c trunk/evas/src/bin/evas_cserve2_requests.c Modified: trunk/evas/src/bin/evas_cserve2.h =================================================================== --- trunk/evas/src/bin/evas_cserve2.h 2012-07-17 14:23:09 UTC (rev 73984) +++ trunk/evas/src/bin/evas_cserve2.h 2012-07-17 14:23:19 UTC (rev 73985) @@ -187,20 +187,20 @@ typedef struct _Slave_Msg_Font_Glyphs_Load Slave_Msg_Font_Glyphs_Load; typedef struct _Slave_Msg_Font_Glyphs_Loaded Slave_Msg_Font_Glyphs_Loaded; -typedef void *(*Font_Request_Msg_Create)(void *data, int *size); -typedef void (*Font_Request_Msg_Free)(void *msg, void *data); -typedef Msg_Base *(*Font_Request_Response)(void *data, void *resp, int *size); -typedef void (*Font_Request_Error)(void *data, Error_Type error); +typedef void *(*Slave_Request_Msg_Create)(void *data, int *size); +typedef void (*Slave_Request_Msg_Free)(void *msg, void *data); +typedef Msg_Base *(*Slave_Request_Response)(void *data, void *resp, int *size); +typedef void (*Slave_Request_Error)(void *data, Error_Type error); -struct _Font_Request_Funcs { - Font_Request_Msg_Create msg_create; - Font_Request_Msg_Free msg_free; - Font_Request_Response response; - Font_Request_Error error; +struct _Slave_Request_Funcs { + Slave_Request_Msg_Create msg_create; + Slave_Request_Msg_Free msg_free; + Slave_Request_Response response; + Slave_Request_Error error; }; -typedef struct _Font_Request Font_Request; -typedef struct _Font_Request_Funcs Font_Request_Funcs; +typedef struct _Slave_Request Slave_Request; +typedef struct _Slave_Request_Funcs Slave_Request_Funcs; typedef enum { FONT_REND_REGULAR = 1, @@ -214,7 +214,7 @@ CSERVE2_REQ_FONT_LOAD, CSERVE2_REQ_FONT_GLYPHS_LOAD, CSERVE2_REQ_LAST -} Font_Request_Type; +} Slave_Request_Type; typedef struct _Glyph_Entry Glyph_Entry; @@ -293,10 +293,10 @@ void cserve2_cache_font_debug(Client *client, unsigned int rid); -Font_Request *cserve2_request_add(Font_Request_Type type, unsigned int rid, Client *client, Font_Request *dep, Font_Request_Funcs *funcs, void *data); -void cserve2_request_waiter_add(Font_Request *req, unsigned int rid, Client *client); -void cserve2_request_cancel(Font_Request *req, Client *client, Error_Type err); -void cserve2_request_cancel_all(Font_Request *req, Error_Type err); +Slave_Request *cserve2_request_add(Slave_Request_Type type, unsigned int rid, Client *client, Slave_Request *dep, Slave_Request_Funcs *funcs, void *data); +void cserve2_request_waiter_add(Slave_Request *req, unsigned int rid, Client *client); +void cserve2_request_cancel(Slave_Request *req, Client *client, Error_Type err); +void cserve2_request_cancel_all(Slave_Request *req, Error_Type err); void cserve2_requests_init(void); void cserve2_requests_shutdown(void); Modified: trunk/evas/src/bin/evas_cserve2_cache.c =================================================================== --- trunk/evas/src/bin/evas_cserve2_cache.c 2012-07-17 14:23:09 UTC (rev 73984) +++ trunk/evas/src/bin/evas_cserve2_cache.c 2012-07-17 14:23:19 UTC (rev 73985) @@ -30,7 +30,7 @@ struct _Entry { unsigned int id; Eina_List *references; - Font_Request *request; + Slave_Request *request; Entry_Type type; #ifdef DEBUG_LOAD_TIME struct timeval load_start; @@ -83,7 +83,7 @@ struct _Font_Entry { Entry base; - Font_Request *request; + Slave_Request *request; unsigned int rend_flags; unsigned int size; unsigned int dpi; @@ -403,11 +403,11 @@ } } -static Font_Request_Funcs _open_funcs = { - .msg_create = (Font_Request_Msg_Create)_open_request_build, +static Slave_Request_Funcs _open_funcs = { + .msg_create = (Slave_Request_Msg_Create)_open_request_build, .msg_free = _request_free, - .response = (Font_Request_Response)_open_request_response, - .error = (Font_Request_Error)_request_failed + .response = (Slave_Request_Response)_open_request_response, + .error = (Slave_Request_Error)_request_failed }; static void * @@ -489,11 +489,11 @@ return _image_loaded_msg_create(e, size); } -static Font_Request_Funcs _load_funcs = { - .msg_create = (Font_Request_Msg_Create)_load_request_build, +static Slave_Request_Funcs _load_funcs = { + .msg_create = (Slave_Request_Msg_Create)_load_request_build, .msg_free = _request_free, - .response = (Font_Request_Response)_load_request_response, - .error = (Font_Request_Error)_request_failed + .response = (Slave_Request_Response)_load_request_response, + .error = (Slave_Request_Error)_request_failed }; static unsigned int @@ -1109,11 +1109,11 @@ _font_entry_reference_del(ref->client, fe); } -static Font_Request_Funcs _font_load_funcs = { - .msg_create = (Font_Request_Msg_Create)_font_load_request_build, - .msg_free = (Font_Request_Msg_Free)_font_load_request_free, - .response = (Font_Request_Response)_font_load_request_response, - .error = (Font_Request_Error)_font_load_request_failed +static Slave_Request_Funcs _font_load_funcs = { + .msg_create = (Slave_Request_Msg_Create)_font_load_request_build, + .msg_free = (Slave_Request_Msg_Free)_font_load_request_free, + .response = (Slave_Request_Response)_font_load_request_response, + .error = (Slave_Request_Error)_font_load_request_failed }; static Eina_Bool @@ -1521,11 +1521,11 @@ { } -static Font_Request_Funcs _glyphs_load_funcs = { - .msg_create = (Font_Request_Msg_Create)_glyphs_load_request_build, - .msg_free = (Font_Request_Msg_Free)_glyphs_load_request_free, - .response = (Font_Request_Response)_glyphs_load_request_response, - .error = (Font_Request_Error)_glyphs_load_request_failed +static Slave_Request_Funcs _glyphs_load_funcs = { + .msg_create = (Slave_Request_Msg_Create)_glyphs_load_request_build, + .msg_free = (Slave_Request_Msg_Free)_glyphs_load_request_free, + .response = (Slave_Request_Response)_glyphs_load_request_response, + .error = (Slave_Request_Error)_glyphs_load_request_failed }; static Eina_Bool @@ -1590,7 +1590,7 @@ msg->images.files_size += sizeof(File_Data) + eina_list_count(fd->images) * sizeof(Eina_List *) + eina_list_count(fd->base.references) * - (sizeof(Font_Request *) + sizeof(Eina_List *)); + (sizeof(Slave_Request *) + sizeof(Eina_List *)); #ifdef DEBUG_LOAD_TIME // accounting file entries load time Modified: trunk/evas/src/bin/evas_cserve2_requests.c =================================================================== --- trunk/evas/src/bin/evas_cserve2_requests.c 2012-07-17 14:23:09 UTC (rev 73984) +++ trunk/evas/src/bin/evas_cserve2_requests.c 2012-07-17 14:23:19 UTC (rev 73985) @@ -33,7 +33,7 @@ */ static struct _Request_Match { - Font_Request_Type rtype; + Slave_Request_Type rtype; Slave_Type stype; Slave_Command ctype; } _request_match[] = @@ -61,16 +61,16 @@ { SLAVE_FONT, 1, NULL, NULL, _create_font_slave }, }; -struct _Font_Request +struct _Slave_Request { EINA_INLIST; - Font_Request_Type type; + Slave_Request_Type type; void *data; void *msg; Eina_List *waiters; Eina_Bool processing; - Font_Request_Funcs *funcs; - Font_Request *dependency; + Slave_Request_Funcs *funcs; + Slave_Request *dependency; Eina_List *dependents; /* list of requests that depend on this one finishing */ Eina_Bool locked : 1; /* locked waiting for a dependency request to finish */ }; @@ -97,7 +97,7 @@ static void _cserve2_requests_process(void); static void -_request_waiter_add(Font_Request *req, Client *client, unsigned int rid) +_request_waiter_add(Slave_Request *req, Client *client, unsigned int rid) { Waiter *w = malloc(sizeof(*w)); @@ -109,10 +109,10 @@ req->waiters = eina_list_append(req->waiters, w); } -Font_Request * -cserve2_request_add(Font_Request_Type type, unsigned int rid, Client *client, Font_Request *dep, Font_Request_Funcs *funcs, void *data) +Slave_Request * +cserve2_request_add(Slave_Request_Type type, unsigned int rid, Client *client, Slave_Request *dep, Slave_Request_Funcs *funcs, void *data) { - Font_Request *req, *r; + Slave_Request *req, *r; req = NULL; @@ -169,15 +169,15 @@ } void -cserve2_request_waiter_add(Font_Request *req, unsigned int rid, Client *client) +cserve2_request_waiter_add(Slave_Request *req, unsigned int rid, Client *client) { _request_waiter_add(req, client, rid); } static void -_request_dependents_cancel(Font_Request *req, Error_Type err) +_request_dependents_cancel(Slave_Request *req, Error_Type err) { - Font_Request *dep; + Slave_Request *dep; EINA_LIST_FREE(req->dependents, dep) { @@ -190,7 +190,7 @@ } void -cserve2_request_cancel(Font_Request *req, Client *client, Error_Type err) +cserve2_request_cancel(Slave_Request *req, Client *client, Error_Type err) { Eina_List *l, *l_next; Waiter *w; @@ -232,7 +232,7 @@ } void -cserve2_request_cancel_all(Font_Request *req, Error_Type err) +cserve2_request_cancel_all(Slave_Request *req, Error_Type err) { Waiter *w; @@ -279,7 +279,7 @@ } static void -_cserve2_request_failed(Font_Request *req, Error_Type type) +_cserve2_request_failed(Slave_Request *req, Error_Type type) { Waiter *w; @@ -304,7 +304,7 @@ _slave_read_cb(Slave *s __UNUSED__, Slave_Command cmd, void *msg, void *data) { Slave_Worker *sw = data; - Font_Request *dep, *req = sw->data; + Slave_Request *dep, *req = sw->data; Eina_List **working, **idle; Waiter *w; Msg_Base *resp = NULL; @@ -364,7 +364,7 @@ _slave_dead_cb(Slave *s __UNUSED__, void *data) { Slave_Worker *sw = data; - Font_Request *req = sw->data; + Slave_Request *req = sw->data; Eina_List **working = &_workers[sw->type].working; if (req) @@ -426,7 +426,7 @@ } static Eina_Bool -_cserve2_request_dispatch(Slave_Worker *sw, Slave_Command ctype, Font_Request *req) +_cserve2_request_dispatch(Slave_Worker *sw, Slave_Command ctype, Slave_Request *req) { int size; char *slave_msg = req->funcs->msg_create(req->data, &size); @@ -459,7 +459,7 @@ unsigned int max_workers; Eina_List **idle, **working; Eina_Inlist *itr; - Font_Request *req; + Slave_Request *req; for (j = 0; _request_match[j].rtype != CSERVE2_REQ_LAST; j++) { |
From: Enlightenment S. <no-...@en...> - 2012-07-17 14:23:38
|
Log: Add Speculative Load type to requests and a way to change requests from one type to another Author: sachiel Date: 2012-07-17 07:23:26 -0700 (Tue, 17 Jul 2012) New Revision: 73986 Trac: http://trac.enlightenment.org/e/changeset/73986 Modified: trunk/evas/src/bin/evas_cserve2.h trunk/evas/src/bin/evas_cserve2_cache.c trunk/evas/src/bin/evas_cserve2_requests.c Modified: trunk/evas/src/bin/evas_cserve2.h =================================================================== --- trunk/evas/src/bin/evas_cserve2.h 2012-07-17 14:23:19 UTC (rev 73985) +++ trunk/evas/src/bin/evas_cserve2.h 2012-07-17 14:23:26 UTC (rev 73986) @@ -211,6 +211,7 @@ typedef enum { CSERVE2_REQ_IMAGE_OPEN = 0, CSERVE2_REQ_IMAGE_LOAD, + CSERVE2_REQ_IMAGE_SPEC_LOAD, CSERVE2_REQ_FONT_LOAD, CSERVE2_REQ_FONT_GLYPHS_LOAD, CSERVE2_REQ_LAST @@ -295,6 +296,7 @@ Slave_Request *cserve2_request_add(Slave_Request_Type type, unsigned int rid, Client *client, Slave_Request *dep, Slave_Request_Funcs *funcs, void *data); void cserve2_request_waiter_add(Slave_Request *req, unsigned int rid, Client *client); +void cserve2_request_type_set(Slave_Request *req, Slave_Request_Type type); void cserve2_request_cancel(Slave_Request *req, Client *client, Error_Type err); void cserve2_request_cancel_all(Slave_Request *req, Error_Type err); void cserve2_requests_init(void); Modified: trunk/evas/src/bin/evas_cserve2_cache.c =================================================================== --- trunk/evas/src/bin/evas_cserve2_cache.c 2012-07-17 14:23:19 UTC (rev 73985) +++ trunk/evas/src/bin/evas_cserve2_cache.c 2012-07-17 14:23:26 UTC (rev 73986) @@ -2035,7 +2035,7 @@ fentry = entry->file; fentry->images = eina_list_append(fentry->images, entry); - entry->base.request = cserve2_request_add(CSERVE2_REQ_IMAGE_LOAD, + entry->base.request = cserve2_request_add(CSERVE2_REQ_IMAGE_SPEC_LOAD, 0, NULL, fentry->base.request, &_load_funcs, entry); return 0; @@ -2069,17 +2069,8 @@ if (entry->base.request) { cserve2_request_waiter_add(entry->base.request, rid, client); - /* do this in *_requests.c. somehow - if ((!entry->base.request->processing) && (!entry->doload)) - { - DBG("Removing entry %d from speculative preload and adding " - "to normal load queue.", entry->base.id); - spload_requests = eina_list_remove(spload_requests, - entry->base.request); - load_requests = eina_list_append(load_requests, - entry->base.request); - } - */ + if (!entry->doload) + cserve2_request_type_set(entry->base.request, CSERVE2_REQ_IMAGE_LOAD); } else if (entry->shm) _image_loaded_send(client, entry, rid); @@ -2121,17 +2112,8 @@ if (entry->base.request) { cserve2_request_waiter_add(entry->base.request, rid, client); - /* do this in *_requests.c. somehow - if ((!entry->base.request->processing) && (!entry->doload)) - { - DBG("Removing entry %d from speculative preload and adding " - "to normal load queue.", entry->base.id); - spload_requests = eina_list_remove(spload_requests, - entry->base.request); - load_requests = eina_list_append(load_requests, - entry->base.request); - } - */ + if (!entry->doload) + cserve2_request_type_set(entry->base.request, CSERVE2_REQ_IMAGE_LOAD); } else if (entry->shm) _image_loaded_send(client, entry, rid); Modified: trunk/evas/src/bin/evas_cserve2_requests.c =================================================================== --- trunk/evas/src/bin/evas_cserve2_requests.c 2012-07-17 14:23:19 UTC (rev 73985) +++ trunk/evas/src/bin/evas_cserve2_requests.c 2012-07-17 14:23:26 UTC (rev 73986) @@ -36,13 +36,16 @@ Slave_Request_Type rtype; Slave_Type stype; Slave_Command ctype; + int require_spares; /* for speculative operations, will require to leave at + least this number of slaves always available */ } _request_match[] = { - { CSERVE2_REQ_IMAGE_OPEN, SLAVE_IMAGE, IMAGE_OPEN }, - { CSERVE2_REQ_IMAGE_LOAD, SLAVE_IMAGE, IMAGE_LOAD }, - { CSERVE2_REQ_FONT_LOAD, SLAVE_FONT, FONT_LOAD }, - { CSERVE2_REQ_FONT_GLYPHS_LOAD, SLAVE_FONT, FONT_GLYPHS_LOAD }, - { CSERVE2_REQ_LAST, 0, 0 } + { CSERVE2_REQ_IMAGE_OPEN, SLAVE_IMAGE, IMAGE_OPEN, 0 }, + { CSERVE2_REQ_IMAGE_LOAD, SLAVE_IMAGE, IMAGE_LOAD, 0 }, + { CSERVE2_REQ_IMAGE_SPEC_LOAD, SLAVE_IMAGE, IMAGE_LOAD, 1 }, + { CSERVE2_REQ_FONT_LOAD, SLAVE_FONT, FONT_LOAD, 0 }, + { CSERVE2_REQ_FONT_GLYPHS_LOAD, SLAVE_FONT, FONT_GLYPHS_LOAD, 0 }, + { CSERVE2_REQ_LAST, 0, 0, 0 } }; static Slave *_create_image_slave(void *data); @@ -174,6 +177,21 @@ _request_waiter_add(req, client, rid); } +void +cserve2_request_type_set(Slave_Request *req, Slave_Request_Type type) +{ + Eina_Inlist **from, **to; + + if (req->processing || (type == req->type)) + return; + + from = &requests[req->type].waiting; + to = &requests[type].waiting; + + *from = eina_inlist_remove(*from, EINA_INLIST_GET(req)); + *to = eina_inlist_append(*to, EINA_INLIST_GET(req)); +} + static void _request_dependents_cancel(Slave_Request *req, Error_Type err) { @@ -488,7 +506,8 @@ { Slave_Worker *sw; - if (eina_list_count(*working) >= max_workers) + if (eina_list_count(*working) >= + (max_workers - _request_match[j].require_spares)) break; if (req->locked) |
From: Enlightenment S. <no-...@en...> - 2012-07-17 14:23:47
|
Log: No need for a separate Slave_Request pointer with font entries Author: sachiel Date: 2012-07-17 07:23:36 -0700 (Tue, 17 Jul 2012) New Revision: 73987 Trac: http://trac.enlightenment.org/e/changeset/73987 Modified: trunk/evas/src/bin/evas_cserve2_cache.c Modified: trunk/evas/src/bin/evas_cserve2_cache.c =================================================================== --- trunk/evas/src/bin/evas_cserve2_cache.c 2012-07-17 14:23:26 UTC (rev 73986) +++ trunk/evas/src/bin/evas_cserve2_cache.c 2012-07-17 14:23:36 UTC (rev 73987) @@ -83,7 +83,6 @@ struct _Font_Entry { Entry base; - Slave_Request *request; unsigned int rend_flags; unsigned int size; unsigned int dpi; @@ -1087,7 +1086,7 @@ _entry_load_finish(&fe->base); } - if (fe->request) fe->request = NULL; + if (fe->base.request) fe->base.request = NULL; /* could be a function, but it's too basic and only used here */ resp = calloc(1, sizeof(*resp)); @@ -1103,7 +1102,7 @@ Eina_List *l; Reference *ref; - if (fe->request) fe->request = NULL; + if (fe->base.request) fe->base.request = NULL; EINA_LIST_FOREACH(fe->base.references, l, ref) _font_entry_reference_del(ref->client, fe); @@ -2172,8 +2171,8 @@ _entry_load_reused(&fe->base); fe->unused = EINA_FALSE; - if (fe->request) - cserve2_request_waiter_add(fe->request, rid, client); + if (fe->base.request) + cserve2_request_waiter_add(fe->base.request, rid, client); else _font_loaded_send(client, rid); free(fullname); @@ -2212,8 +2211,8 @@ fe->src = fs; fs->references++; DBG("adding FONT_LOAD '%s' request.", fs->name); - fe->request = cserve2_request_add(CSERVE2_REQ_FONT_LOAD, rid, - client, NULL, &_font_load_funcs, fe); + fe->base.request = cserve2_request_add(CSERVE2_REQ_FONT_LOAD, rid, client, + NULL, &_font_load_funcs, fe); eina_hash_direct_add(font_entries, fe, fe); @@ -2270,8 +2269,8 @@ } else { - cserve2_request_add(CSERVE2_REQ_FONT_GLYPHS_LOAD, rid, - client, req->fe->request, &_glyphs_load_funcs, req); + cserve2_request_add(CSERVE2_REQ_FONT_GLYPHS_LOAD, rid, client, + req->fe->base.request, &_glyphs_load_funcs, req); } return 0; } |
From: Enlightenment S. <no-...@en...> - 2012-07-17 14:23:49
|
Log: When changing request type, it helps to let the request know what its new type is Author: sachiel Date: 2012-07-17 07:23:43 -0700 (Tue, 17 Jul 2012) New Revision: 73988 Trac: http://trac.enlightenment.org/e/changeset/73988 Modified: trunk/evas/src/bin/evas_cserve2_requests.c Modified: trunk/evas/src/bin/evas_cserve2_requests.c =================================================================== --- trunk/evas/src/bin/evas_cserve2_requests.c 2012-07-17 14:23:36 UTC (rev 73987) +++ trunk/evas/src/bin/evas_cserve2_requests.c 2012-07-17 14:23:43 UTC (rev 73988) @@ -188,6 +188,7 @@ from = &requests[req->type].waiting; to = &requests[type].waiting; + req->type = type; *from = eina_inlist_remove(*from, EINA_INLIST_GET(req)); *to = eina_inlist_append(*to, EINA_INLIST_GET(req)); } |
From: Enlightenment S. <no-...@en...> - 2012-07-17 14:24:05
|
Log: Avoid calling the requets callbacks if the entry was freed Author: sachiel Date: 2012-07-17 07:23:54 -0700 (Tue, 17 Jul 2012) New Revision: 73989 Trac: http://trac.enlightenment.org/e/changeset/73989 Modified: trunk/evas/src/bin/evas_cserve2_requests.c Modified: trunk/evas/src/bin/evas_cserve2_requests.c =================================================================== --- trunk/evas/src/bin/evas_cserve2_requests.c 2012-07-17 14:23:43 UTC (rev 73988) +++ trunk/evas/src/bin/evas_cserve2_requests.c 2012-07-17 14:23:54 UTC (rev 73989) @@ -76,6 +76,7 @@ Slave_Request *dependency; Eina_List *dependents; /* list of requests that depend on this one finishing */ Eina_Bool locked : 1; /* locked waiting for a dependency request to finish */ + Eina_Bool cancelled : 1; }; struct _Waiter @@ -247,7 +248,8 @@ free(req); } - + else if (!req->waiters) + req->cancelled = EINA_TRUE; } void @@ -271,7 +273,10 @@ _request_dependents_cancel(req, err); if (req->processing) - return; + { + req->cancelled = EINA_TRUE; + return; + } if (req->dependency) req->dependency->dependents = eina_list_remove( @@ -329,6 +334,9 @@ Msg_Base *resp = NULL; int resp_size; + if (req->cancelled) + goto free_it; + if (cmd == ERROR) { Error_Type *err = msg; @@ -355,7 +363,9 @@ free(resp); +free_it: req->funcs->msg_free(req->msg, req->data); + // FIXME: We shouldn't free this message directly, it must be freed by a // callback. free(msg); |