Enlightenment CVS committal Author : onefang Project : e17 Module : apps/e
Dir : e17/apps/e/src/bin Modified Files: e_apps.c Log Message: Get rid of the nasty hash walks. =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_apps.c,v retrieving revision 1.228 retrieving revision 1.229 diff -u -3 -r1.228 -r1.229 --- e_apps.c 15 Oct 2006 01:35:07 -0000 1.228 +++ e_apps.c 15 Oct 2006 13:25:37 -0000 1.229 @@ -42,13 +42,16 @@ struct _E_App_Hash_Idler { Ecore_Idler *idler; - int all_done; - double begin, pass; + /* We keep a seperate list so that nothing external can change it between + * idler calls. Means we might miss some during the idler run, but since + * this is just an optimization pre load thing, then that's no problem. + */ + Evas_List *apps; + double begin, pass; }; static Evas_Bool _e_apps_hash_cb_init (Evas_Hash *hash, const char *key, void *data, void *fdata); static int _e_apps_hash_idler_cb (void *data); -static Evas_Bool _e_apps_hash_idler_cb_init(Evas_Hash *hash, const char *key, void *data, void *fdata); static void _e_app_free (E_App *a); static E_App *_e_app_subapp_file_find (E_App *a, const char *file); static void _e_app_change (E_App *a, E_App_Change ch); @@ -150,6 +153,7 @@ _e_apps_every_app = evas_hash_direct_add(_e_apps_every_app, app->path, app); app->parent = _e_apps_all; _e_apps_all->subapps = evas_list_prepend(_e_apps_all->subapps, app); + _e_apps_hash_idler.apps = evas_list_append(_e_apps_hash_idler.apps, app); e_object_ref(E_OBJECT(app)); } } @@ -158,33 +162,52 @@ printf("INITIAL APP SCAN %3.3f\n", ecore_time_get() - begin); ecore_desktop_instrumentation_print(); ecore_desktop_instrumentation_reset(); - _e_apps_hash_idler.all_done = 0; _e_apps_hash_idler.begin = ecore_time_get(); _e_apps_hash_idler.idler = ecore_idler_add(_e_apps_hash_idler_cb, &_e_apps_hash_idler); return 1; } - static int _e_apps_hash_idler_cb(void *data) { struct _E_App_Hash_Idler *idler; idler = data; - idler->all_done = 1; idler->pass = ecore_time_get(); - /* Even though we are only interested in the next one, the hash may have changed - * since we last looked at it, so iterate through them again. Doesn't seem to - * slow the process down much. - */ - /* FIXME: on a slow enough system this will never complete. the hash walk - * may abort before scanning anything t all (entries walked in hash all - * already filled but further entries later in the hash walk will never - * be reashed as timeout happens before getting there) - */ - evas_hash_foreach(_e_apps_every_app, _e_apps_hash_idler_cb_init, idler); - printf("\nIDLE APP FILLING PASS %3.3f\n", ecore_time_get() - idler->pass); - if (idler->all_done) + while (idler->apps != NULL) + { + E_App *a; + double t; + + a = idler->apps->data; + E_OBJECT_CHECK(a); + E_OBJECT_TYPE_CHECK(a, E_APP_TYPE); + if ((!a->idle_fill) && (!a->filled)) + { + struct stat st; + + a->idle_fill = 1; + if (stat(a->path, &st) >= 0) + a->mtime = st.st_mtime; + e_app_fields_fill(a, a->path); + } +#if IDLE_ICONS + if ((!a->idle_icon) && (a->icon_type == E_APP_ICON_UNKNOWN)) + { + int theme_match = 0; + + a->idle_icon = 1; + _e_app_icon_type(a); + } +#endif + /* FIXME: This time should be since the beginnig of all idler processing, + * and the time limit should be tied to the frame rate. + */ + idler->apps = evas_list_remove_list(idler->apps, idler->apps); + t = ecore_time_get() - idler->pass; + if (t > 0.02) break; + } + if (idler->apps == NULL) { printf("\nIDLE APP FILLING SCAN %3.3f\n", ecore_time_get() - idler->begin); #if CLEVER_BORDERS @@ -196,49 +219,6 @@ } return 1; } - -static Evas_Bool -_e_apps_hash_idler_cb_init(Evas_Hash *hash, const char *key, void *data, void *fdata) -{ - E_App *a; - struct _E_App_Hash_Idler *idler; - double t; - - a = data; - idler = fdata; - E_OBJECT_CHECK(a); - E_OBJECT_TYPE_CHECK(a, E_APP_TYPE); - /* Either fill an E_App, or look for an icon of an already filled E_App. - * Icon searching can take a long time, so don't do both at once. */ - if ((!a->idle_fill) && (!a->filled)) - { - struct stat st; - - a->idle_fill = 1; - if (stat(a->path, &st) >= 0) - a->mtime = st.st_mtime; - /* FIXME: the main problem is this call - when it does get run it can - * sometimes take 0.2 or 0.3 seconds, causing much jerkiness */ - e_app_fields_fill(a, a->path); - } -#if IDLE_ICONS - else if ((!a->idle_icon) && (a->icon_type == E_APP_ICON_UNKNOWN)) - { - int theme_match = 0; - - a->idle_icon = 1; - _e_app_icon_type(a); - } -#endif - /* FIXME: This time should be since the beginnig of all idler processing, - * and the time limit should be tied to the frame rate. - */ - t = ecore_time_get() - idler->pass; - if (t < 0.02) return 1; - idler->all_done = 0; - return 0; -} - #if CLEVER_BORDERS ------------------------------------------------------------------------- Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs