[PATCH v3 00/16] Fix signal-unsafe logging

Chase Douglas chase.douglas at canonical.com
Mon Apr 16 11:14:17 PDT 2012


This new patchset has some large improvements:

* Variadic logging. This is done using preprocessor magic, so it is
  incompatible with the current variadic logging. It is also not type-
  safe (it could be with C11 _Generic, but only clang supports it so
  far). It also only supports up to 10 arguments. If you pass more, bad
  things might happen, but we can always increase the size as needed.
  Due to these issues and formatting limitations, I don't think we
  should switch all our logging to be signal-safe. We just have to be
  more careful with signal-safe logging.

  The logging is now *printf-like. However, it only supports %s, %u, %x,
  and %p (because it was trivial). I haven't see any need for %d, so I
  didn't add it. No modifiers of any sort are supported, %u and %x are
  extended to 64-bit values.

  The macro magic requires an ugly GCC pragma hack to turn off a
  specific warning for when casting a pointer return value of a function
  to a non-pointer value. I can't come up with a casting mechanism that
  GCC likes for all scenarios, and we are admittedly doing horrible,
  awful casting that normally would be verboten.

* Added ErrorSigSafe() macro and converted all the ErrorF signal logging
  to it.

* Made BUG_WARN* signal safe.

* Use BUG_WARN_MSG() when logging unsafely in signal context. This logs
  the full backtrace so it is even easier to find the offending message.

Unfortunately, I don't have time right now to get to unit testing. I
must drop this work in order to get back to some Ubuntu release stuff.

-- Chase


More information about the xorg-devel mailing list