dri: Fix the logger error message handling.
authorEric Anholt <eric@anholt.net>
Thu, 23 Jan 2014 19:03:53 +0000 (11:03 -0800)
committerEric Anholt <eric@anholt.net>
Mon, 27 Jan 2014 17:37:29 +0000 (09:37 -0800)
Since the loader changes, there has been a compiler warning that the
prototype didn't match.  It turns out that if a loader error message was
ever thrown, you'd segfault because of trying to use the warning level as
a format string.

Reviewed-by: Keith Packard <keithp@keithp.com>
Tested-by: Keith Packard <keithp@keithp.com>
Reviewed-by: Kristian Høgsberg <krh@bitplanet.net>
src/glx/dri3_glx.c
src/glx/dri_common.c
src/glx/dri_common.h

index 3e829651c0568520ce5e5d2d6082522c3dafb2dd..2a9f0b7353c3ddccc0aa959e4c2e25c9a15ca2f5 100644 (file)
@@ -1803,7 +1803,7 @@ dri3_create_display(Display * dpy)
    pdp->base.destroyDisplay = dri3_destroy_display;
    pdp->base.createScreen = dri3_create_screen;
 
-   loader_set_logger(ErrorMessageF);
+   loader_set_logger(dri_message);
    i = 0;
 
    pdp->loader_extensions[i++] = &imageLoaderExtension.base;
index b5058c97c6e583c5b6ab3dc61fff241171243b4f..93c45ea7bbdfee06a48740652505494de086465f 100644 (file)
@@ -40,6 +40,7 @@
 #include <stdarg.h>
 #include "glxclient.h"
 #include "dri_common.h"
+#include "loader.h"
 
 #ifndef RTLD_NOW
 #define RTLD_NOW 0
 #define RTLD_GLOBAL 0
 #endif
 
+_X_HIDDEN void
+dri_message(int level, const char *f, ...)
+{
+   va_list args;
+   int threshold = _LOADER_WARNING;
+   const char *libgl_debug;
+
+   libgl_debug = getenv("LIBGL_DEBUG");
+   if (libgl_debug) {
+      if (strstr(libgl_debug, "quiet"))
+         threshold = _LOADER_FATAL;
+      else if (strstr(libgl_debug, "verbose"))
+         threshold = _LOADER_DEBUG;
+   }
+
+   /* Note that the _LOADER_* levels are lower numbers for more severe. */
+   if (level <= threshold) {
+      fprintf(stderr, "libGL%s: ", level <= _LOADER_WARNING ? " error" : "");
+      va_start(args, f);
+      vfprintf(stderr, f, args);
+      va_end(args);
+   }
+}
+
 /**
  * Print informational message to stderr if LIBGL_DEBUG is set to
  * "verbose".
index 4fe0d3faf98d11505f5dbeb787e51bbc506b5af6..425d89f9224314f0930a69d460357d62cc0f410f 100644 (file)
 #include <GL/internal/dri_interface.h>
 #include <stdbool.h>
 
+#if (__GNUC__ >= 3)
+#define PRINTFLIKE(f, a) __attribute__ ((format(__printf__, f, a)))
+#else
+#define PRINTFLIKE(f, a)
+#endif
+
 typedef struct __GLXDRIconfigPrivateRec __GLXDRIconfigPrivate;
 
 struct __GLXDRIconfigPrivateRec
@@ -61,10 +67,10 @@ driReleaseDrawables(struct glx_context *gc);
 
 extern const __DRIsystemTimeExtension systemTimeExtension;
 
-extern void InfoMessageF(const char *f, ...);
+extern void dri_message(int level, const char *f, ...) PRINTFLIKE(2, 3);
 
+extern void InfoMessageF(const char *f, ...);
 extern void ErrorMessageF(const char *f, ...);
-
 extern void CriticalErrorMessageF(const char *f, ...);
 
 extern void *driOpenDriver(const char *driverName);