util/osdep: Avoid madvise proto on modern Solaris
On older Solaris releases (before Solaris 11), we didn't get a prototype for madvise, and so util/osdep.c provides its own prototype. Some time between the public Solaris 11.4 release and Solaris 11.4.42 CBE, we started getting an madvise prototype that looks like this: extern int madvise(void *, size_t, int); which conflicts with the prototype in util/osdeps.c. Instead of always declaring this prototype, check if we're missing the madvise() prototype, and only declare it ourselves if the prototype is missing. Move the prototype to include/qemu/osdep.h, the normal place to handle platform-specific header quirks. The 'missing_madvise_proto' meson check contains an obviously wrong prototype for madvise. So if that code compiles and links, we must be missing the actual prototype for madvise. Signed-off-by: Andrew Deason <adeason@sinenomine.net> Message-id: 20220316035227.3702-2-adeason@sinenomine.net Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
eb7a38ba66
commit
8900c204df
@ -400,6 +400,14 @@ void qemu_anon_ram_free(void *ptr, size_t size);
|
||||
#define SIGIO SIGPOLL
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_MADVISE_WITHOUT_PROTOTYPE
|
||||
/*
|
||||
* See MySQL bug #7156 (http://bugs.mysql.com/bug.php?id=7156) for discussion
|
||||
* about Solaris missing the madvise() prototype.
|
||||
*/
|
||||
extern int madvise(char *, size_t, int);
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_LINUX)
|
||||
#ifndef BUS_MCEERR_AR
|
||||
#define BUS_MCEERR_AR 4
|
||||
|
23
meson.build
23
meson.build
@ -1715,11 +1715,30 @@ config_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + '''
|
||||
#error Not supported
|
||||
#endif
|
||||
}'''))
|
||||
config_host_data.set('CONFIG_MADVISE', cc.links(gnu_source_prefix + '''
|
||||
|
||||
has_madvise = cc.links(gnu_source_prefix + '''
|
||||
#include <sys/types.h>
|
||||
#include <sys/mman.h>
|
||||
#include <stddef.h>
|
||||
int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }'''))
|
||||
int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }''')
|
||||
missing_madvise_proto = false
|
||||
if has_madvise
|
||||
# Some platforms (illumos and Solaris before Solaris 11) provide madvise()
|
||||
# but forget to prototype it. In this case, has_madvise will be true (the
|
||||
# test program links despite a compile warning). To detect the
|
||||
# missing-prototype case, we try again with a definitely-bogus prototype.
|
||||
# This will only compile if the system headers don't provide the prototype;
|
||||
# otherwise the conflicting prototypes will cause a compiler error.
|
||||
missing_madvise_proto = cc.links(gnu_source_prefix + '''
|
||||
#include <sys/types.h>
|
||||
#include <sys/mman.h>
|
||||
#include <stddef.h>
|
||||
extern int madvise(int);
|
||||
int main(void) { return madvise(0); }''')
|
||||
endif
|
||||
config_host_data.set('CONFIG_MADVISE', has_madvise)
|
||||
config_host_data.set('HAVE_MADVISE_WITHOUT_PROTOTYPE', missing_madvise_proto)
|
||||
|
||||
config_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + '''
|
||||
#include <sys/mman.h>
|
||||
int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }'''))
|
||||
|
@ -28,9 +28,6 @@
|
||||
|
||||
#ifdef CONFIG_SOLARIS
|
||||
#include <sys/statvfs.h>
|
||||
/* See MySQL bug #7156 (http://bugs.mysql.com/bug.php?id=7156) for
|
||||
discussion about Solaris header problems */
|
||||
extern int madvise(char *, size_t, int);
|
||||
#endif
|
||||
|
||||
#include "qemu-common.h"
|
||||
|
Loading…
Reference in New Issue
Block a user