forked from enlightenment/efl
efreet: Don't stat .desktop file on every fetch
SVN revision: 62559
This commit is contained in:
parent
56f3b3b278
commit
a0861d7c26
|
@ -622,32 +622,32 @@ efreet_desktop_edd(void)
|
|||
|
||||
if (desktop_edd) return desktop_edd;
|
||||
|
||||
EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Efreet_Desktop);
|
||||
EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Efreet_Cache_Desktop);
|
||||
desktop_edd = eet_data_descriptor_file_new(&eddc);
|
||||
if (!desktop_edd) return NULL;
|
||||
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Desktop, "type", type, EET_T_INT);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Desktop, "version", version, EET_T_STRING);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Desktop, "orig_path", orig_path, EET_T_STRING);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Desktop, "load_time", load_time, EET_T_LONG_LONG);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Desktop, "name", name, EET_T_STRING);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Desktop, "generic_name", generic_name, EET_T_STRING);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Desktop, "comment", comment, EET_T_STRING);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Desktop, "icon", icon, EET_T_STRING);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Desktop, "try_exec", try_exec, EET_T_STRING);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Desktop, "exec", exec, EET_T_STRING);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Desktop, "path", path, EET_T_STRING);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Desktop, "startup_wm_class", startup_wm_class, EET_T_STRING);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Desktop, "url", url, EET_T_STRING);
|
||||
eet_data_descriptor_element_add(desktop_edd, "only_show_in", EET_T_STRING, EET_G_LIST, offsetof(Efreet_Desktop, only_show_in), 0, NULL, NULL);
|
||||
eet_data_descriptor_element_add(desktop_edd, "not_show_in", EET_T_STRING, EET_G_LIST, offsetof(Efreet_Desktop, not_show_in), 0, NULL, NULL);
|
||||
eet_data_descriptor_element_add(desktop_edd, "categories", EET_T_STRING, EET_G_LIST, offsetof(Efreet_Desktop, categories), 0, NULL, NULL);
|
||||
eet_data_descriptor_element_add(desktop_edd, "mime_types", EET_T_STRING, EET_G_LIST, offsetof(Efreet_Desktop, mime_types), 0, NULL, NULL);
|
||||
eet_data_descriptor_element_add(desktop_edd, "x", EET_T_STRING, EET_G_HASH, offsetof(Efreet_Desktop, x), 0, NULL, NULL);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Desktop, "no_display", no_display, EET_T_UCHAR);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Desktop, "hidden", hidden, EET_T_UCHAR);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Desktop, "terminal", terminal, EET_T_UCHAR);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Desktop, "startup_notify", startup_notify, EET_T_UCHAR);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "type", desktop.type, EET_T_INT);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "version", desktop.version, EET_T_STRING);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "orig_path", desktop.orig_path, EET_T_STRING);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "load_time", desktop.load_time, EET_T_LONG_LONG);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "name", desktop.name, EET_T_STRING);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "generic_name", desktop.generic_name, EET_T_STRING);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "comment", desktop.comment, EET_T_STRING);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "icon", desktop.icon, EET_T_STRING);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "try_exec", desktop.try_exec, EET_T_STRING);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "exec", desktop.exec, EET_T_STRING);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "path", desktop.path, EET_T_STRING);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "startup_wm_class", desktop.startup_wm_class, EET_T_STRING);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "url", desktop.url, EET_T_STRING);
|
||||
eet_data_descriptor_element_add(desktop_edd, "only_show_in", EET_T_STRING, EET_G_LIST, offsetof(Efreet_Cache_Desktop, desktop.only_show_in), 0, NULL, NULL);
|
||||
eet_data_descriptor_element_add(desktop_edd, "not_show_in", EET_T_STRING, EET_G_LIST, offsetof(Efreet_Cache_Desktop, desktop.not_show_in), 0, NULL, NULL);
|
||||
eet_data_descriptor_element_add(desktop_edd, "categories", EET_T_STRING, EET_G_LIST, offsetof(Efreet_Cache_Desktop, desktop.categories), 0, NULL, NULL);
|
||||
eet_data_descriptor_element_add(desktop_edd, "mime_types", EET_T_STRING, EET_G_LIST, offsetof(Efreet_Cache_Desktop, desktop.mime_types), 0, NULL, NULL);
|
||||
eet_data_descriptor_element_add(desktop_edd, "x", EET_T_STRING, EET_G_HASH, offsetof(Efreet_Cache_Desktop, desktop.x), 0, NULL, NULL);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "no_display", desktop.no_display, EET_T_UCHAR);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "hidden", desktop.hidden, EET_T_UCHAR);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "terminal", desktop.terminal, EET_T_UCHAR);
|
||||
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "startup_notify", desktop.startup_notify, EET_T_UCHAR);
|
||||
|
||||
return desktop_edd;
|
||||
}
|
||||
|
@ -806,7 +806,7 @@ efreet_cache_array_string_free(Efreet_Cache_Array_String *array)
|
|||
Efreet_Desktop *
|
||||
efreet_cache_desktop_find(const char *file)
|
||||
{
|
||||
Efreet_Desktop *cache;
|
||||
Efreet_Cache_Desktop *cache;
|
||||
char rp[PATH_MAX];
|
||||
|
||||
if (!realpath(file, rp)) return NULL;
|
||||
|
@ -815,17 +815,48 @@ efreet_cache_desktop_find(const char *file)
|
|||
|
||||
cache = eina_hash_find(desktops, rp);
|
||||
if (cache == NON_EXISTING) return NULL;
|
||||
if (cache) return cache;
|
||||
if (cache)
|
||||
{
|
||||
/* If less than one second since last stat, return desktop */
|
||||
if ((ecore_time_get() - cache->check_time) < 1)
|
||||
{
|
||||
INF("Return without stat %f %f", ecore_time_get(), cache->check_time);
|
||||
return &cache->desktop;
|
||||
}
|
||||
if (cache->desktop.load_time == ecore_file_mod_time(cache->desktop.orig_path))
|
||||
{
|
||||
INF("Return with stat %f %f", ecore_time_get(), cache->check_time);
|
||||
cache->check_time = ecore_time_get();
|
||||
return &cache->desktop;
|
||||
}
|
||||
|
||||
/* We got stale data. The desktop will be free'd eventually as
|
||||
* users will call efreet_desktop_free */
|
||||
eina_hash_set(desktops, rp, NON_EXISTING);
|
||||
cache = NULL;
|
||||
}
|
||||
|
||||
cache = eet_data_read(desktop_cache, efreet_desktop_edd(), rp);
|
||||
if (cache)
|
||||
{
|
||||
cache->eet = 1;
|
||||
eina_hash_add(desktops, cache->orig_path, cache);
|
||||
if (cache->desktop.load_time != ecore_file_mod_time(cache->desktop.orig_path))
|
||||
{
|
||||
/* Don't return stale data */
|
||||
INF("We got stale data in the desktop cache");
|
||||
efreet_cache_desktop_free(&cache->desktop);
|
||||
eina_hash_set(desktops, rp, NON_EXISTING);
|
||||
}
|
||||
else
|
||||
{
|
||||
cache->desktop.eet = 1;
|
||||
cache->check_time = ecore_time_get();
|
||||
eina_hash_set(desktops, cache->desktop.orig_path, cache);
|
||||
return &cache->desktop;
|
||||
}
|
||||
}
|
||||
else
|
||||
eina_hash_add(desktops, rp, NON_EXISTING);
|
||||
return cache;
|
||||
eina_hash_set(desktops, rp, NON_EXISTING);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -841,12 +872,15 @@ efreet_cache_desktop_free(Efreet_Desktop *desktop)
|
|||
|
||||
curr = eina_hash_find(desktops, desktop->orig_path);
|
||||
if (curr == desktop)
|
||||
{
|
||||
INF("Found in current cache, purge\n");
|
||||
eina_hash_del_by_key(desktops, desktop->orig_path);
|
||||
}
|
||||
|
||||
EINA_LIST_FOREACH(old_desktop_caches, l, d)
|
||||
{
|
||||
curr = eina_hash_find(d->hash, desktop->orig_path);
|
||||
if (curr && curr == desktop)
|
||||
if (curr == desktop)
|
||||
{
|
||||
INF("Found in old cache, purge\n");
|
||||
eina_hash_del_by_key(d->hash, desktop->orig_path);
|
||||
|
|
|
@ -33,6 +33,7 @@ EAPI Eet_Data_Descriptor *efreet_icon_fallback_edd(void);
|
|||
|
||||
typedef struct _Efreet_Cache_Icon_Theme Efreet_Cache_Icon_Theme;
|
||||
typedef struct _Efreet_Cache_Directory Efreet_Cache_Directory;
|
||||
typedef struct _Efreet_Cache_Desktop Efreet_Cache_Desktop;
|
||||
|
||||
struct _Efreet_Cache_Icon_Theme
|
||||
{
|
||||
|
@ -54,4 +55,11 @@ struct _Efreet_Cache_Directory
|
|||
long long modified_time;
|
||||
};
|
||||
|
||||
struct _Efreet_Cache_Desktop
|
||||
{
|
||||
Efreet_Desktop desktop;
|
||||
|
||||
double check_time; /**< Last time we check for disk modification */
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -65,7 +65,6 @@ struct Efreet_Desktop_Type_Info
|
|||
Efreet_Desktop_Type_Free_Cb free_func;
|
||||
};
|
||||
|
||||
static int efreet_desktop_cache_check(Efreet_Desktop *desktop);
|
||||
static int efreet_desktop_read(Efreet_Desktop *desktop);
|
||||
static Efreet_Desktop_Type_Info *efreet_desktop_type_parse(const char *type_str);
|
||||
static void efreet_desktop_type_info_free(Efreet_Desktop_Type_Info *info);
|
||||
|
@ -207,15 +206,12 @@ efreet_desktop_new(const char *file)
|
|||
if (desktop)
|
||||
{
|
||||
desktop->ref++;
|
||||
if (efreet_desktop_cache_check(desktop))
|
||||
if (!efreet_desktop_environment_check(desktop))
|
||||
{
|
||||
if (!efreet_desktop_environment_check(desktop))
|
||||
{
|
||||
efreet_desktop_free(desktop);
|
||||
return NULL;
|
||||
}
|
||||
return desktop;
|
||||
efreet_desktop_free(desktop);
|
||||
return NULL;
|
||||
}
|
||||
return desktop;
|
||||
efreet_desktop_free(desktop);
|
||||
}
|
||||
return efreet_desktop_uncached_new(file);
|
||||
|
@ -567,24 +563,6 @@ efreet_desktop_string_list_join(Eina_List *list)
|
|||
return string;
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
* @param desktop The desktop to check
|
||||
* @return Returns 1 if the cache is still valid, 0 otherwise
|
||||
* @brief This will check if the desktop cache is still valid.
|
||||
*/
|
||||
static int
|
||||
efreet_desktop_cache_check(Efreet_Desktop *desktop)
|
||||
{
|
||||
if (!desktop) return 0;
|
||||
|
||||
/* have we modified this file since we last read it in? */
|
||||
if (ecore_file_mod_time(desktop->orig_path) != desktop->load_time)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
* @param desktop The desktop to fill
|
||||
|
|
Loading…
Reference in New Issue