sysemu/os-win32: Test for and use _lock_file/_unlock_file

The bug referenced in os-win32.h was fixed in mingw-w64 v6.

According to repology, version 5 used by ubuntu 18, which is
not yet out of support, so provide a meson link test for it.

Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20220417183019.755276-27-richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson 2022-04-17 11:30:06 -07:00
parent 7fc493f8bd
commit 6391c772d7
2 changed files with 21 additions and 7 deletions

View File

@ -109,20 +109,22 @@ static inline char *realpath(const char *path, char *resolved_path)
return resolved_path;
}
/* ??? Mingw appears to export _lock_file and _unlock_file as the functions
* with which to lock a stdio handle. But something is wrong in the markup,
* either in the header or the library, such that we get undefined references
* to "_imp___lock_file" etc when linking. Since we seem to have no other
* alternative, and the usage within the logging functions isn't critical,
* ignore FILE locking.
/*
* Older versions of MinGW do not import _lock_file and _unlock_file properly.
* This was fixed for v6.0.0 with commit b48e3ac8969d.
*/
static inline void qemu_flockfile(FILE *f)
{
#ifdef HAVE__LOCK_FILE
_lock_file(f);
#endif
}
static inline void qemu_funlockfile(FILE *f)
{
#ifdef HAVE__LOCK_FILE
_unlock_file(f);
#endif
}
/* We wrap all the sockets functions so that we can

View File

@ -2030,6 +2030,18 @@ foreach k, v: config_host
endif
endforeach
# Older versions of MinGW do not import _lock_file and _unlock_file properly.
# This was fixed for v6.0.0 with commit b48e3ac8969d.
if targetos == 'windows'
config_host_data.set('HAVE__LOCK_FILE', cc.links('''
#include <stdio.h>
int main(void) {
_lock_file(NULL);
_unlock_file(NULL);
return 0;
}''', name: '_lock_file and _unlock_file'))
endif
########################
# Target configuration #
########################