syscall flood on every time*() function call
truss show that GTK app do many times:
27100: openat(AT_FDCWD,"/etc/localtime",O_RDONLY,00) = 114 (0x72)
27100: fstat(114,{ mode=-r--r--r-- ,inode=1845941,size=1518,blksize=32768 }) = 0 (0x0)
27100: mmap(0x0,1518,PROT_READ,MAP_PRIVATE,114,0x0) = 34458873856 (0x805e8b000)
27100: close(114) = 0 (0x0)
27100: munmap(0x805e8b000,1518) = 0 (0x0)
I found article: set-environment-variable-save-thousands-of-system-calls
and try to set:
env TZ=":/etc/localtime" truss -fD geany
or
env TZ="Europe/Moscow" truss -fD geany
without success.
I discovered that glib time zone cache is does not work properly:
GDateTime *
g_date_time_new_from_unix_local (gint64 t)
{
GDateTime *datetime;
GTimeZone *local;
local = g_time_zone_new_local ();
datetime = g_date_time_new_from_unix (local, t);
g_time_zone_unref (local);
return datetime;
}
GTimeZone *
g_time_zone_new_local (void)
{
return g_time_zone_new (getenv ("TZ"));
}
g_time_zone_new()
load and add time zone to cache if arg is not NULL.
g_time_zone_unref()
- remove time zone from cache.
As you can see time zone in most cases removed from cache after short time.
Patch keep zone pointer with ref=1 and for g_time_zone_ref()
for time zone getenv ("TZ")
and UTC
.
After apply patch even without set TZ
env var no more syscall flood happen.
Edited by Jeff Fortin