After profiling a nixglhost hot run, it turns out that we were
spending more than 98% of the run time reading and sha256-hashing
files.
Let's give up on content hashing the files and assume that using their
name, size and last write time is good enough.
On a hot run, we reduce the run time from about 3s to 0.3s on a
nvme-powered ryzen 7 desktop.
I guess this 10x speedup probably worth the little cache corectness we
lose on the way.
We made the incorrect assumption that the first DSO we'd stumble upon
in the load path would be the most appropriate one for the host
system. IE. it'd be the x86_64-gnu-linux on such a system. It turned
out not being the case, meaning we can't take such a shortcut and have
to handle the case where we end up with multiple same libraries for
different archs.
This forced us to do two things:
1. It forced us to rethink the cache directory structure. We now have
to cache each library directory separately. Meaning we now have to
inject the GLX/EGL/Cuda directories of *all* these library
directories subpaths to the LD_LIBRARY_PATH. The dynamic linker
will then try to open these DSOs (and fail) until it stumble upon
the appropriate one.
2. We had to give up on the way we injected EGL libraries using
asolute paths. We don't know which DSO is adapted to the wrapped
program arch. Instead of injecting the absolute paths through the
JSON configuration files, we just stipulate the libraries names in
them. We then inject the various EGL DSOs we find through the
LD_LIBRARY_PATH, similarly to what we already do for GLX and Cuda.