glib: bump min required glib library version to 2.40

Per supported platforms doc[1], the various min glib on relevant distros is:

  RHEL-7: 2.50.3
  Debian (Stretch): 2.50.3
  Debian (Jessie): 2.42.1
  OpenBSD (Ports): 2.54.3
  FreeBSD (Ports): 2.50.3
  OpenSUSE Leap 15: 2.54.3
  SLE12-SP2: 2.48.2
  Ubuntu (Xenial): 2.48.0
  macOS (Homebrew): 2.56.0

This suggests that a minimum glib of 2.42 is a reasonable target.

The GLibC compile farm, however, uses Ubuntu 14.04 (Trusty) which only
has glib 2.40.0, and this is needed for testing during merge. Thus an
exception is made to the documented platform support policy to allow for
all three current LTS releases to be supported.

Docker jobs that not longer satisfy this new min version are removed.

[1] https://qemu.weilnetz.de/doc/qemu-doc.html#Supported-build-platforms

Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
Daniel P. Berrangé 2018-05-04 15:34:46 +01:00
parent c5f1d0c493
commit e7b3af8159
13 changed files with 11 additions and 467 deletions

6
configure vendored
View File

@ -3433,11 +3433,7 @@ fi
##########################################
# glib support probe
if test "$mingw32" = yes; then
glib_req_ver=2.30
else
glib_req_ver=2.22
fi
glib_req_ver=2.40
glib_modules=gthread-2.0
if test "$modules" = yes; then
glib_modules="$glib_modules gmodule-export-2.0"

View File

@ -30,11 +30,7 @@ static int qcrypto_hash_alg_map[QCRYPTO_HASH_ALG__MAX] = {
[QCRYPTO_HASH_ALG_SHA224] = -1,
[QCRYPTO_HASH_ALG_SHA256] = G_CHECKSUM_SHA256,
[QCRYPTO_HASH_ALG_SHA384] = -1,
#if GLIB_CHECK_VERSION(2, 36, 0)
[QCRYPTO_HASH_ALG_SHA512] = G_CHECKSUM_SHA512,
#else
[QCRYPTO_HASH_ALG_SHA512] = -1,
#endif
[QCRYPTO_HASH_ALG_RIPEMD160] = -1,
};

View File

@ -17,9 +17,6 @@
#include "crypto/hmac.h"
#include "hmacpriv.h"
/* Support for HMAC Algos has been added in GLib 2.30 */
#if GLIB_CHECK_VERSION(2, 30, 0)
static int qcrypto_hmac_alg_map[QCRYPTO_HASH_ALG__MAX] = {
[QCRYPTO_HASH_ALG_MD5] = G_CHECKSUM_MD5,
[QCRYPTO_HASH_ALG_SHA1] = G_CHECKSUM_SHA1,
@ -126,39 +123,6 @@ qcrypto_glib_hmac_bytesv(QCryptoHmac *hmac,
return 0;
}
#else
bool qcrypto_hmac_supports(QCryptoHashAlgorithm alg)
{
return false;
}
void *qcrypto_hmac_ctx_new(QCryptoHashAlgorithm alg,
const uint8_t *key, size_t nkey,
Error **errp)
{
return NULL;
}
static void
qcrypto_glib_hmac_ctx_free(QCryptoHmac *hmac)
{
return;
}
static int
qcrypto_glib_hmac_bytesv(QCryptoHmac *hmac,
const struct iovec *iov,
size_t niov,
uint8_t **result,
size_t *resultlen,
Error **errp)
{
return -1;
}
#endif
QCryptoHmacDriver qcrypto_hmac_lib_driver = {
.hmac_bytesv = qcrypto_glib_hmac_bytesv,
.hmac_free = qcrypto_glib_hmac_ctx_free,

View File

@ -18,27 +18,6 @@
#include <glib.h>
/* GLIB version compatibility flags */
#if !GLIB_CHECK_VERSION(2, 26, 0)
#define G_TIME_SPAN_SECOND (G_GINT64_CONSTANT(1000000))
#endif
#if !GLIB_CHECK_VERSION(2, 28, 0)
static inline gint64 qemu_g_get_monotonic_time(void)
{
/* g_get_monotonic_time() is best-effort so we can use the wall clock as a
* fallback.
*/
GTimeVal time;
g_get_current_time(&time);
return time.tv_sec * G_TIME_SPAN_SECOND + time.tv_usec;
}
/* work around distro backports of this interface */
#define g_get_monotonic_time() qemu_g_get_monotonic_time()
#endif
#if defined(_WIN32) && !GLIB_CHECK_VERSION(2, 50, 0)
/*
* g_poll has a problem on Windows when using
@ -48,228 +27,6 @@ static inline gint64 qemu_g_get_monotonic_time(void)
gint g_poll_fixed(GPollFD *fds, guint nfds, gint timeout);
#endif
#if !GLIB_CHECK_VERSION(2, 30, 0)
/* Not a 100% compatible implementation, but good enough for most
* cases. Placeholders are only supported at the end of the
* template. */
static inline gchar *qemu_g_dir_make_tmp(gchar const *tmpl, GError **error)
{
gchar *path = g_build_filename(g_get_tmp_dir(), tmpl ?: ".XXXXXX", NULL);
if (mkdtemp(path) != NULL) {
return path;
}
/* Error occurred, clean up. */
g_set_error(error, G_FILE_ERROR, g_file_error_from_errno(errno),
"mkdtemp() failed");
g_free(path);
return NULL;
}
#define g_dir_make_tmp(tmpl, error) qemu_g_dir_make_tmp(tmpl, error)
#endif /* glib 2.30 */
#if !GLIB_CHECK_VERSION(2, 31, 0)
/* before glib-2.31, GMutex and GCond was dynamic-only (there was a separate
* GStaticMutex, but it didn't work with condition variables).
*
* Our implementation uses GOnce to fake a static implementation that does
* not require separate initialization.
* We need to rename the types to avoid passing our CompatGMutex/CompatGCond
* by mistake to a function that expects GMutex/GCond. However, for ease
* of use we keep the GLib function names. GLib uses macros for the
* implementation, we use inline functions instead and undefine the macros.
*/
typedef struct CompatGMutex {
GOnce once;
} CompatGMutex;
typedef struct CompatGCond {
GOnce once;
} CompatGCond;
static inline gpointer do_g_mutex_new(gpointer unused)
{
return (gpointer) g_mutex_new();
}
static inline void g_mutex_init(CompatGMutex *mutex)
{
mutex->once = (GOnce) G_ONCE_INIT;
}
static inline void g_mutex_clear(CompatGMutex *mutex)
{
g_assert(mutex->once.status != G_ONCE_STATUS_PROGRESS);
if (mutex->once.retval) {
g_mutex_free((GMutex *) mutex->once.retval);
}
mutex->once = (GOnce) G_ONCE_INIT;
}
static inline void (g_mutex_lock)(CompatGMutex *mutex)
{
g_once(&mutex->once, do_g_mutex_new, NULL);
g_mutex_lock((GMutex *) mutex->once.retval);
}
#undef g_mutex_lock
static inline gboolean (g_mutex_trylock)(CompatGMutex *mutex)
{
g_once(&mutex->once, do_g_mutex_new, NULL);
return g_mutex_trylock((GMutex *) mutex->once.retval);
}
#undef g_mutex_trylock
static inline void (g_mutex_unlock)(CompatGMutex *mutex)
{
g_mutex_unlock((GMutex *) mutex->once.retval);
}
#undef g_mutex_unlock
static inline gpointer do_g_cond_new(gpointer unused)
{
return (gpointer) g_cond_new();
}
static inline void g_cond_init(CompatGCond *cond)
{
cond->once = (GOnce) G_ONCE_INIT;
}
static inline void g_cond_clear(CompatGCond *cond)
{
g_assert(cond->once.status != G_ONCE_STATUS_PROGRESS);
if (cond->once.retval) {
g_cond_free((GCond *) cond->once.retval);
}
cond->once = (GOnce) G_ONCE_INIT;
}
static inline void (g_cond_wait)(CompatGCond *cond, CompatGMutex *mutex)
{
g_assert(mutex->once.status != G_ONCE_STATUS_PROGRESS);
g_once(&cond->once, do_g_cond_new, NULL);
g_cond_wait((GCond *) cond->once.retval, (GMutex *) mutex->once.retval);
}
#undef g_cond_wait
static inline void (g_cond_broadcast)(CompatGCond *cond)
{
g_once(&cond->once, do_g_cond_new, NULL);
g_cond_broadcast((GCond *) cond->once.retval);
}
#undef g_cond_broadcast
static inline void (g_cond_signal)(CompatGCond *cond)
{
g_once(&cond->once, do_g_cond_new, NULL);
g_cond_signal((GCond *) cond->once.retval);
}
#undef g_cond_signal
static inline gboolean (g_cond_timed_wait)(CompatGCond *cond,
CompatGMutex *mutex,
GTimeVal *time)
{
g_assert(mutex->once.status != G_ONCE_STATUS_PROGRESS);
g_once(&cond->once, do_g_cond_new, NULL);
return g_cond_timed_wait((GCond *) cond->once.retval,
(GMutex *) mutex->once.retval, time);
}
#undef g_cond_timed_wait
/* This is not a macro, because it didn't exist until 2.32. */
static inline gboolean g_cond_wait_until(CompatGCond *cond, CompatGMutex *mutex,
gint64 end_time)
{
GTimeVal time;
/* Convert from monotonic to CLOCK_REALTIME. */
end_time -= g_get_monotonic_time();
g_get_current_time(&time);
end_time += time.tv_sec * G_TIME_SPAN_SECOND + time.tv_usec;
time.tv_sec = end_time / G_TIME_SPAN_SECOND;
time.tv_usec = end_time % G_TIME_SPAN_SECOND;
return g_cond_timed_wait(cond, mutex, &time);
}
/* before 2.31 there was no g_thread_new() */
static inline GThread *g_thread_new(const char *name,
GThreadFunc func, gpointer data)
{
GThread *thread = g_thread_create(func, data, TRUE, NULL);
if (!thread) {
g_error("creating thread");
}
return thread;
}
#else
#define CompatGMutex GMutex
#define CompatGCond GCond
#endif /* glib 2.31 */
#if !GLIB_CHECK_VERSION(2, 32, 0)
/* Beware, function returns gboolean since 2.39.2, see GLib commit 9101915 */
static inline void g_hash_table_add(GHashTable *hash_table, gpointer key)
{
g_hash_table_replace(hash_table, key, key);
}
static inline gboolean g_hash_table_contains(GHashTable *hash_table,
gpointer key)
{
return g_hash_table_lookup_extended(hash_table, key, NULL, NULL);
}
#define G_SOURCE_CONTINUE TRUE
#define G_SOURCE_REMOVE FALSE
#endif
#ifndef g_assert_true
#define g_assert_true(expr) \
do { \
if (G_LIKELY(expr)) { \
} else { \
g_assertion_message(G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
"'" #expr "' should be TRUE"); \
} \
} while (0)
#endif
#ifndef g_assert_false
#define g_assert_false(expr) \
do { \
if (G_LIKELY(!(expr))) { \
} else { \
g_assertion_message(G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
"'" #expr "' should be FALSE"); \
} \
} while (0)
#endif
#ifndef g_assert_null
#define g_assert_null(expr) \
do { \
if (G_LIKELY((expr) == NULL)) { \
} else { \
g_assertion_message(G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
"'" #expr "' should be NULL"); \
} \
} while (0)
#endif
#ifndef g_assert_nonnull
#define g_assert_nonnull(expr) \
do { \
if (G_LIKELY((expr) != NULL)) { \
} else { \
g_assertion_message(G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
"'" #expr "' should not be NULL"); \
} \
} while (0)
#endif
#ifndef g_assert_cmpmem
#define g_assert_cmpmem(m1, l1, m2, l2) \
@ -288,80 +45,4 @@ static inline gboolean g_hash_table_contains(GHashTable *hash_table,
} while (0)
#endif
#if !GLIB_CHECK_VERSION(2, 28, 0)
static inline void g_list_free_full(GList *list, GDestroyNotify free_func)
{
GList *l;
for (l = list; l; l = l->next) {
free_func(l->data);
}
g_list_free(list);
}
static inline void g_slist_free_full(GSList *list, GDestroyNotify free_func)
{
GSList *l;
for (l = list; l; l = l->next) {
free_func(l->data);
}
g_slist_free(list);
}
#endif
#if !GLIB_CHECK_VERSION(2, 26, 0)
static inline void g_source_set_name(GSource *source, const char *name)
{
/* This is just a debugging aid, so leaving it a no-op */
}
static inline void g_source_set_name_by_id(guint tag, const char *name)
{
/* This is just a debugging aid, so leaving it a no-op */
}
#endif
#if !GLIB_CHECK_VERSION(2, 36, 0)
/* Always fail. This will not include error_report output in the test log,
* sending it instead to stderr.
*/
#define g_test_initialized() (0)
#endif
#if !GLIB_CHECK_VERSION(2, 38, 0)
#ifdef CONFIG_HAS_GLIB_SUBPROCESS_TESTS
#error schizophrenic detection of glib subprocess testing
#endif
#define g_test_subprocess() (0)
#endif
#if !GLIB_CHECK_VERSION(2, 34, 0)
static inline void
g_test_add_data_func_full(const char *path,
gpointer data,
gpointer fn,
gpointer data_free_func)
{
#if GLIB_CHECK_VERSION(2, 26, 0)
/* back-compat casts, remove this once we can require new-enough glib */
g_test_add_vtable(path, 0, data, NULL,
(GTestFixtureFunc)fn, (GTestFixtureFunc) data_free_func);
#else
/* back-compat casts, remove this once we can require new-enough glib */
g_test_add_vtable(path, 0, data, NULL,
(void (*)(void)) fn, (void (*)(void)) data_free_func);
#endif
}
#endif
/* Small compat shim from glib 2.32 */
#ifndef G_SOURCE_CONTINUE
#define G_SOURCE_CONTINUE TRUE
#endif
#ifndef G_SOURCE_REMOVE
#define G_SOURCE_REMOVE FALSE
#endif
#endif

View File

@ -414,10 +414,8 @@ GuestExec *qmp_guest_exec(const char *path,
argv = guest_exec_get_args(&arglist, true);
envp = has_env ? guest_exec_get_args(env, false) : NULL;
flags = G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD;
#if GLIB_CHECK_VERSION(2, 33, 2)
flags |= G_SPAWN_SEARCH_PATH_FROM_ENVP;
#endif
flags = G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD |
G_SPAWN_SEARCH_PATH_FROM_ENVP;
if (!has_output) {
flags |= G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL;
}
@ -514,7 +512,6 @@ GuestHostName *qmp_guest_get_host_name(Error **err)
GuestTimezone *qmp_guest_get_timezone(Error **errp)
{
#if GLIB_CHECK_VERSION(2, 28, 0)
GuestTimezone *info = NULL;
GTimeZone *tz = NULL;
gint64 now = 0;
@ -544,8 +541,4 @@ GuestTimezone *qmp_guest_get_timezone(Error **errp)
error:
g_free(info);
return NULL;
#else
error_setg(errp, QERR_UNSUPPORTED);
return NULL;
#endif
}

View File

@ -1,30 +0,0 @@
FROM centos:6
RUN yum install -y epel-release centos-release-xen
ENV PACKAGES \
bison \
bzip2-devel \
ccache \
csnappy-devel \
flex \
g++ \
gcc \
gettext \
git \
glib2-devel \
libepoxy-devel \
libfdt-devel \
librdmacm-devel \
lzo-devel \
make \
mesa-libEGL-devel \
mesa-libgbm-devel \
pixman-devel \
SDL-devel \
spice-glib-devel \
spice-server-devel \
tar \
vte-devel \
xen-devel \
zlib-devel
RUN yum install -y $PACKAGES
RUN rpm -q $PACKAGES | sort > /packages.txt

View File

@ -1,8 +0,0 @@
FROM centos:6
RUN yum install -y \
tar gettext git make gcc g++ \
zlib-devel SDL-devel pixman-devel \
epel-release
RUN yum install -y libfdt-devel ccache
RUN yum downgrade -y http://vault.centos.org/6.0/os/x86_64/Packages/glib2-2.22.5-5.el6.x86_64.rpm
RUN yum install -y http://vault.centos.org/6.0/os/x86_64/Packages/glib2-devel-2.22.5-5.el6.x86_64.rpm

View File

@ -504,12 +504,6 @@ int main(int argc, char **argv)
const char *arch = qtest_get_arch();
gchar dir[] = "/tmp/ivshmem-test.XXXXXX";
#if !GLIB_CHECK_VERSION(2, 31, 0)
if (!g_thread_supported()) {
g_thread_init(NULL);
}
#endif
g_test_init(&argc, &argv, NULL);
qtest_add_abrt_handler(abrt_handler, NULL);

View File

@ -32,7 +32,7 @@ typedef struct QDictCmpData {
} QDictCmpData;
TestEventData *test_event_data;
static CompatGMutex test_event_lock;
static GMutex test_event_lock;
/* Only compares bool, int, string */
static
@ -242,12 +242,6 @@ static void test_event_d(TestEventData *data,
int main(int argc, char **argv)
{
#if !GLIB_CHECK_VERSION(2, 31, 0)
if (!g_thread_supported()) {
g_thread_init(NULL);
}
#endif
qmp_event_set_func_emit(event_test_emit);
g_test_init(&argc, &argv, NULL);

View File

@ -24,8 +24,8 @@ struct tpm_hdr {
} QEMU_PACKED;
typedef struct TestState {
CompatGMutex data_mutex;
CompatGCond data_cond;
GMutex data_mutex;
GCond data_cond;
SocketAddress *addr;
QIOChannel *tpm_ioc;
GThread *emu_tpm_thread;

View File

@ -32,14 +32,6 @@
#include <linux/virtio_net.h>
#include <sys/vfs.h>
/* GLIB version compatibility flags */
#if !GLIB_CHECK_VERSION(2, 26, 0)
#define G_TIME_SPAN_SECOND (G_GINT64_CONSTANT(1000000))
#endif
#if GLIB_CHECK_VERSION(2, 28, 0)
#define HAVE_MONOTONIC_TIME
#endif
#define QEMU_CMD_MEM " -m %d -object memory-backend-file,id=mem,size=%dM," \
"mem-path=%s,share=on -numa node,memdev=mem"
@ -150,8 +142,8 @@ typedef struct TestServer {
int fds_num;
int fds[VHOST_MEMORY_MAX_NREGIONS];
VhostUserMemory memory;
CompatGMutex data_mutex;
CompatGCond data_cond;
GMutex data_mutex;
GCond data_cond;
int log_fd;
uint64_t rings;
bool test_fail;
@ -642,21 +634,7 @@ test_migrate_source_check(GSource *source)
return FALSE;
}
#if !GLIB_CHECK_VERSION(2,36,0)
/* this callback is unnecessary with glib >2.36, the default
* prepare for the source does the same */
static gboolean
test_migrate_source_prepare(GSource *source, gint *timeout)
{
*timeout = -1;
return FALSE;
}
#endif
GSourceFuncs test_migrate_source_funcs = {
#if !GLIB_CHECK_VERSION(2,36,0)
.prepare = test_migrate_source_prepare,
#endif
.check = test_migrate_source_check,
};

View File

@ -36,9 +36,9 @@
* Trace records are written out by a dedicated thread. The thread waits for
* records to become available, writes them out, and then waits again.
*/
static CompatGMutex trace_lock;
static CompatGCond trace_available_cond;
static CompatGCond trace_empty_cond;
static GMutex trace_lock;
static GCond trace_available_cond;
static GCond trace_empty_cond;
static bool trace_available;
static bool trace_writeout_enabled;

View File

@ -504,20 +504,6 @@ int socket_init(void)
return 0;
}
#if !GLIB_CHECK_VERSION(2, 31, 0)
/* Ensure that glib is running in multi-threaded mode
* Old versions of glib require explicit initialization. Failure to do
* this results in the single-threaded code paths being taken inside
* glib. For example, the g_slice allocator will not be thread-safe
* and cause crashes.
*/
static void __attribute__((constructor)) thread_init(void)
{
if (!g_thread_supported()) {
g_thread_init(NULL);
}
}
#endif
#ifndef CONFIG_IOVEC
/* helper function for iov_send_recv() */