[libcxx] [test] Simplify get_temp_file_name() for mingw

Use the same codepaths as for MSVC. Mingw-w64 does have the _mktemp_s
function; on Vista and newer, msvcrt.dll does contain the function,
which ends up called. (Same thing in the UCRT.) In older versions of
msvcrt.dll (older than what libc++ supports), mingw-w64 provides a
fallback implementation.

This effectively reverts 23323e25f8 (and
d07e5c23b4). That commit tried to fix
unspecified MinGW build breakage.

This reduces the risk of temp name collisions between processes (when
running multiple tests in parallel); the path returned by
GetTempFileName can easily collide with other similar paths.
(_mktemp_s on the other hand tries to avoid such clashes by using
the process id as part of the uniqueness seed.)

This avoids stray random failures in fstreams tests in mingw configurations.

Differential Revision: https://reviews.llvm.org/D98526
This commit is contained in:
Martin Storsjö 2021-03-12 17:58:30 +02:00
parent fe6dbe7e95
commit c5a74c0890

View file

@ -46,9 +46,7 @@
#include <locale>
#include <string>
#if defined(_WIN32)
# define WIN32_LEAN_AND_MEAN // Reduce overhead of including windows.h
# include <io.h> // _mktemp_s
# include <windows.h> // MAX_PATH, GetTempPath, GetTempFileName
#else
# include <unistd.h> // close
#endif
@ -63,13 +61,7 @@ extern "C" {
inline
std::string get_temp_file_name()
{
#if defined(__MINGW32__)
char Path[MAX_PATH + 1];
char FN[MAX_PATH + 1];
do { } while (0 == GetTempPath(MAX_PATH+1, Path));
do { } while (0 == GetTempFileName(Path, "libcxx", 0, FN));
return FN;
#elif defined(_WIN32)
#if defined(_WIN32)
char Name[] = "libcxx.XXXXXX";
if (_mktemp_s(Name, sizeof(Name)) != 0) abort();
return Name;