diff --git a/src/common/rclconfig.cpp b/src/common/rclconfig.cpp index 7d540426..ecfa3124 100644 --- a/src/common/rclconfig.cpp +++ b/src/common/rclconfig.cpp @@ -1398,36 +1398,38 @@ string RclConfig::getIdxStatusFile() const // Thanks to user Madhu for this fix. string RclConfig::getPidfile() const { - string fn; + static string fn; + if (fn.empty()) { #ifndef _WIN32 - const char *p = getenv("XDG_RUNTIME_DIR"); - string rundir; - if (nullptr == p) { - // Problem is, we may have been launched outside the desktop, maybe by cron. Basing - // everything on XDG_RUNTIME_DIR was a mistake, sometimes resulting in different pidfiles - // being used by recollindex instances. So explicitely test for /run/user/$uid, still - // leaving open the remote possibility that XDG_RUNTIME_DIR would be set to something - // else... - rundir = path_cat("/run/user", lltodecstr(getuid())); - if (path_isdir(rundir)) { - p = rundir.c_str(); + const char *p = getenv("XDG_RUNTIME_DIR"); + string rundir; + if (nullptr == p) { + // Problem is, we may have been launched outside the desktop, maybe by cron. Basing + // everything on XDG_RUNTIME_DIR was a mistake, sometimes resulting in different pidfiles + // being used by recollindex instances. So explicitely test for /run/user/$uid, still + // leaving open the remote possibility that XDG_RUNTIME_DIR would be set to something + // else... + rundir = path_cat("/run/user", lltodecstr(getuid())); + if (path_isdir(rundir)) { + p = rundir.c_str(); + } + } + if (p) { + string base = path_canon(p); + string digest, hex; + string cfdir = path_canon(getConfDir()); + path_catslash(cfdir); + MD5String(cfdir, digest); + MD5HexPrint(digest, hex); + fn = path_cat(base, "recoll-" + hex + "-index.pid"); + goto out; } - } - if (p) { - string base = path_canon(p); - string digest, hex; - string cfdir = path_canon(getConfDir()); - path_catslash(cfdir); - MD5String(cfdir, digest); - MD5HexPrint(digest, hex); - fn = path_cat(base, "recoll-" + hex + "-index.pid"); - goto out; - } #endif // ! _WIN32 - fn = path_cat(getCacheDir(), "index.pid"); + fn = path_cat(getCacheDir(), "index.pid"); out: - LOGINF("RclConfig: pid/lock file: " << fn << "\n"); + LOGINF("RclConfig: pid/lock file: " << fn << "\n"); + } return fn; }