Cygwin: use win pid+threadid for forkables dirname

Rather than newest last write time of all dlls loaded, use the forking
process' windows pid and windows thread id as directory name to create
the forkable hardlinks into.  While this may create hardlinks more
often, it does avoid conflicts between dlls not having the newest last
write time.
This commit is contained in:
Michael Haubenwallner 2019-04-12 15:32:56 +02:00 committed by Corinna Vinschen
parent a0b0a4a018
commit 204efa6bba
1 changed files with 7 additions and 19 deletions

View File

@ -340,30 +340,18 @@ exename (PWCHAR buf, ssize_t bufsize)
return format_IndexNumber (buf, bufsize, &d->fii.IndexNumber); return format_IndexNumber (buf, bufsize, &d->fii.IndexNumber);
} }
/* Into buf if not NULL, write the newest dll's LastWriteTime. /* Into buf if not NULL, write the current Windows Thread Identifier.
Return the number of characters (that would be) written. */ Return the number of characters (that would be) written. */
static int static int
lwtimename (PWCHAR buf, ssize_t bufsize) winthrname (PWCHAR buf, ssize_t bufsize)
{ {
if (!buf) if (!buf)
return sizeof (LARGE_INTEGER) * 2; return sizeof (DWORD) * 4;
if (bufsize >= 0 && bufsize <= (int)sizeof (LARGE_INTEGER) * 2) if (bufsize >= 0 && bufsize <= (int)sizeof (DWORD) * 4)
return 0; return 0;
LARGE_INTEGER newest = { 0 }; return __small_swprintf (buf, L"%08X%08X",
/* Need by-handle-file-information for _all_ loaded dlls, GetCurrentProcessId(), GetCurrentThreadId());
as most recent ctime forms the hardlinks directory. */
dll *d = &dlls.start;
while ((d = d->next))
{
/* LastWriteTime more properly tells the last file-content modification
time, because a newly created hardlink may have a different
CreationTime compared to the original file. */
if (d->fbi.LastWriteTime.QuadPart > newest.QuadPart)
newest = d->fbi.LastWriteTime;
}
return __small_swprintf (buf, L"%016X", newest);
} }
struct namepart { struct namepart {
@ -382,7 +370,7 @@ forkable_nameparts[] = {
{ L"<sid>", sidname, true, true, }, { L"<sid>", sidname, true, true, },
{ L"<exe>", exename, false, false, }, { L"<exe>", exename, false, false, },
{ MUTEXSEP, NULL, false, false, }, { MUTEXSEP, NULL, false, false, },
{ L"<ctime>", lwtimename, true, true, }, { L"<winthr>", winthrname, true, true, },
{ NULL, NULL }, { NULL, NULL },
}; };