@@ -1362,7 +1362,7 @@ void libxl__event_disaster(libxl__egc *egc, const char *msg, int errnoval,
{
EGC_GC;
- libxl__log(CTX, XTL_CRITICAL, errnoval, file, line, func,
+ libxl__log(CTX, XTL_CRITICAL, errnoval, file, line, func, INVALID_DOMID,
"DISASTER in event loop: %s%s%s%s",
msg,
type ? " (relates to event type " : "",
@@ -1943,7 +1943,7 @@ libxl__ao *libxl__ao_create(libxl_ctx *ctx, uint32_t domid,
ao->poller = libxl__poller_get(&ao->gc);
if (!ao->poller) goto out;
}
- libxl__log(ctx,XTL_DEBUG,-1,file,line,func,
+ libxl__log(ctx,XTL_DEBUG,-1,file,line,func,domid,
"ao %p: create: how=%p callback=%p poller=%p",
ao, how, ao->how.callback, ao->poller);
@@ -1962,13 +1962,17 @@ int libxl__ao_inprogress(libxl__ao *ao,
{
AO_GC;
int rc;
+ uint32_t domid = ao->domid;
assert(ao->magic == LIBXL__AO_MAGIC);
assert(ao->constructing);
assert(ao->in_initiator);
ao->constructing = 0;
- libxl__log(CTX,XTL_DEBUG,-1,file,line,func,
+ if (ao->nested_root)
+ domid = ao->nested_root->domid;
+
+ libxl__log(CTX,XTL_DEBUG,-1,file,line,func,domid,
"ao %p: inprogress: poller=%p, flags=%s%s%s%s",
ao, ao->poller,
ao->constructing ? "o" : "",
@@ -22,7 +22,7 @@ void libxl__alloc_failed(libxl_ctx *ctx, const char *func,
#define M "libxl: FATAL ERROR: memory allocation failure"
#define L (size ? M " (%s, %lu x %lu)\n" : M " (%s)\n"), \
func, (unsigned long)nmemb, (unsigned long)size
- libxl__log(ctx, XTL_CRITICAL, ENOMEM, 0,0, func, L);
+ libxl__log(ctx, XTL_CRITICAL, ENOMEM, 0,0, func, INVALID_DOMID, L);
fprintf(stderr, L);
fflush(stderr);
_exit(-1);
@@ -202,7 +202,7 @@ char *libxl__dirname(libxl__gc *gc, const char *s)
void libxl__logv(libxl_ctx *ctx, xentoollog_level msglevel, int errnoval,
const char *file, int line, const char *func,
- const char *fmt, va_list ap)
+ uint32_t domid, const char *fmt, va_list ap)
{
/* WARNING this function may not call any libxl-provided
* memory allocation function, as those may
@@ -211,6 +211,7 @@ void libxl__logv(libxl_ctx *ctx, xentoollog_level msglevel, int errnoval,
char *base = NULL;
int rc, esave;
char fileline[256];
+ char domain[256];
esave = errno;
@@ -221,22 +222,25 @@ void libxl__logv(libxl_ctx *ctx, xentoollog_level msglevel, int errnoval,
if (file) snprintf(fileline, sizeof(fileline), "%s:%d",file,line);
fileline[sizeof(fileline)-1] = 0;
+ domain[0] = 0;
+ if (domid != INVALID_DOMID)
+ snprintf(domain, sizeof(domain), "Domain %"PRIu32":", domid);
x:
xtl_log(ctx->lg, msglevel, errnoval, "libxl",
- "%s%s%s%s" "%s",
+ "%s%s%s%s%s" "%s",
fileline, func&&file?":":"", func?func:"", func||file?": ":"",
- base);
+ domain, base);
if (base != enomem) free(base);
errno = esave;
}
void libxl__log(libxl_ctx *ctx, xentoollog_level msglevel, int errnoval,
const char *file, int line, const char *func,
- const char *fmt, ...)
+ uint32_t domid, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
- libxl__logv(ctx, msglevel, errnoval, file, line, func, fmt, ap);
+ libxl__logv(ctx, msglevel, errnoval, file, line, func, domid, fmt, ap);
va_end(ap);
}
@@ -152,13 +152,22 @@
#define LIBXL__LOGGING_ENABLED
#ifdef LIBXL__LOGGING_ENABLED
-#define LIBXL__LOG(ctx, loglevel, _f, _a...) libxl__log(ctx, loglevel, -1, __FILE__, __LINE__, __func__, _f, ##_a)
-#define LIBXL__LOG_ERRNO(ctx, loglevel, _f, _a...) libxl__log(ctx, loglevel, errno, __FILE__, __LINE__, __func__, _f, ##_a)
-#define LIBXL__LOG_ERRNOVAL(ctx, loglevel, errnoval, _f, _a...) libxl__log(ctx, loglevel, errnoval, __FILE__, __LINE__, __func__, _f, ##_a)
+#define LIBXL__LOG(ctx, loglevel, _f, _a...) libxl__log(ctx, loglevel, -1, __FILE__, __LINE__, __func__, INVALID_DOMID, _f, ##_a)
+#define LIBXL__LOG_ERRNO(ctx, loglevel, _f, _a...) libxl__log(ctx, loglevel, errno, __FILE__, __LINE__, __func__, INVALID_DOMID, _f, ##_a)
+#define LIBXL__LOG_ERRNOVAL(ctx, loglevel, errnoval, _f, _a...) libxl__log(ctx, loglevel, errnoval, __FILE__, __LINE__, __func__, INVALID_DOMID, _f, ##_a)
+
+/* Same log functions as above, but with _d being a domain id. */
+#define LIBXL__LOGD(ctx, loglevel, _d, _f, _a...) libxl__log(ctx, loglevel, -1, __FILE__, __LINE__, __func__, _d, _f, ##_a)
+#define LIBXL__LOGD_ERRNO(ctx, loglevel, _d, _f, _a...) libxl__log(ctx, loglevel, errno, __FILE__, __LINE__, __func__, _d, _f, ##_a)
+#define LIBXL__LOGD_ERRNOVAL(ctx, loglevel, errnoval, _d, _f, _a...) libxl__log(ctx, loglevel, errnoval, __FILE__, __LINE__, __func__, _d, _f, ##_a)
#else
#define LIBXL__LOG(ctx, loglevel, _f, _a...)
#define LIBXL__LOG_ERRNO(ctx, loglevel, _f, _a...)
#define LIBXL__LOG_ERRNOVAL(ctx, loglevel, errnoval, _f, _a...)
+
+#define LIBXLD__LOG(ctx, loglevel, _d, _f, _a...)
+#define LIBXLD__LOG_ERRNO(ctx, loglevel, _d, _f, _a...)
+#define LIBXLD__LOG_ERRNOVAL(ctx, loglevel, errnoval, _d, _f, _a...)
#endif
/* all of these macros preserve errno (saving and restoring) */
@@ -169,14 +178,16 @@
_hidden void libxl__logv(libxl_ctx *ctx, xentoollog_level msglevel, int errnoval,
const char *file /* may be 0 */, int line /* ignored if !file */,
const char *func /* may be 0 */,
+ uint32_t domid /* may be INVALID_DOMID */,
const char *fmt, va_list al)
- __attribute__((format(printf,7,0)));
+ __attribute__((format(printf,8,0)));
_hidden void libxl__log(libxl_ctx *ctx, xentoollog_level msglevel, int errnoval,
const char *file /* may be 0 */, int line /* ignored if !file */,
const char *func /* may be 0 */,
+ uint32_t domid /* may be INVALID_DOMID */,
const char *fmt, ...)
- __attribute__((format(printf,7,8)));
+ __attribute__((format(printf,8,9)));
/* these functions preserve errno (saving and restoring) */
@@ -3875,22 +3886,35 @@ _hidden void libxl__remus_restore_setup(libxl__egc *egc,
* void LOG(<xtl_level_suffix>, const char *fmt, ...);
* void LOGE(<xtl_level_suffix>, const char *fmt, ...);
* void LOGEV(<xtl_level_suffix>, int errnoval, const char *fmt, ...);
+ *
+ * void LOGD(<xtl_level_suffix>, uint32_t domid, const char *fmt, ...);
+ * void LOGED(<xtl_level_suffix>, uint32_t domid, const char *fmt, ...);
+ * void LOGEVD(<xtl_level_suffix>, int errnoval, uint32_t domid, const char *fmt, ...);
* Use
* libxl__gc *gc;
*
- * Trivial convenience wrappers for LIBXL__LOG, LIBXL__LOG_ERRNO and
- * LIBXL__LOG_ERRNOVAL, respectively (and thus for libxl__log).
+ * Trivial convenience wrappers for LIBXL__LOG, LIBXL__LOG_ERRNO,
+ * LIBXL__LOG_ERRNOVAL, LIBXL__LOGD, LIBXL__LOGD_ERRNO and
+ * LIBXL__LOGD_ERRNOVAL respectively (and thus for libxl__log).
*
* XTL_<xtl_level_suffix> should exist and be an xentoollog.h log level
* So <xtl_level_suffix> should be one of
* DEBUG VERBOSE DETAIL PROGRESS INFO NOTICE WARN ERROR ERROR CRITICAL
* Of these, most of libxl uses
* DEBUG INFO WARN ERROR
+ *
+ * The LOG*D family will preprend the log message with a string formatted
+ * as follows: 'Domain %PRIu32:'. This should help better automatic sorting
+ * of log messages per domain.
*/
#define LOG(l,f, ...) LIBXL__LOG(CTX,XTL_##l,(f),##__VA_ARGS__)
#define LOGE(l,f, ...) LIBXL__LOG_ERRNO(CTX,XTL_##l,(f),##__VA_ARGS__)
#define LOGEV(l,e,f, ...) LIBXL__LOG_ERRNOVAL(CTX,XTL_##l,(e),(f),##__VA_ARGS__)
+#define LOGD(l,d,f, ...) LIBXL__LOGD(CTX,XTL_##l,(d),(f),##__VA_ARGS__)
+#define LOGED(l,d,f, ...) LIBXL__LOGD_ERRNO(CTX,XTL_##l,(d),(f),##__VA_ARGS__)
+#define LOGEVD(l,e,d,f, ...) LIBXL__LOGD_ERRNOVAL(CTX,XTL_##l,(e),(d),(f),##__VA_ARGS__)
+
/* Locking functions. See comment for "lock" member of libxl__ctx. */