Move dtrace probe macros into separate header file

The dtrace probe macros rely on the logging API. We can't make
the internal.h header include the virlog.h header though since
that'd be a circular include. Instead simply split the dtrace
probes into their own header file, since there's no compelling
reason for them to be in the main internal.h header.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
Daniel P. Berrange 2014-02-27 13:41:11 +00:00
parent 3887c5d83b
commit b29275d928
13 changed files with 111 additions and 72 deletions

View File

@ -52,6 +52,7 @@
#include "object_event.h"
#include "domain_conf.h"
#include "network_conf.h"
#include "virprobe.h"
#include "viraccessapicheck.h"
#define VIR_FROM_THIS VIR_FROM_RPC

View File

@ -366,78 +366,6 @@
# define VIR_ROUND_UP(value, size) (VIR_DIV_UP(value, size) * (size))
# if WITH_DTRACE_PROBES
# ifndef LIBVIRT_PROBES_H
# define LIBVIRT_PROBES_H
# include "libvirt_probes.h"
# endif /* LIBVIRT_PROBES_H */
/* Systemtap 1.2 headers have a bug where they cannot handle a
* variable declared with array type. Work around this by casting all
* arguments. This is some gross use of the preprocessor because
* PROBE is a var-arg macro, but it is better than the alternative of
* making all callers to PROBE have to be aware of the issues. And
* hopefully, if we ever add a call to PROBE with other than 9
* end arguments, you can figure out the pattern to extend this hack.
*/
# define VIR_COUNT_ARGS(...) VIR_ARG11(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
# define VIR_ARG11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, ...) _11
# define VIR_ADD_CAST_EXPAND(a, b, ...) VIR_ADD_CAST_PASTE(a, b, __VA_ARGS__)
# define VIR_ADD_CAST_PASTE(a, b, ...) a##b(__VA_ARGS__)
/* The double cast is necessary to silence gcc warnings; any pointer
* can safely go to intptr_t and back to void *, which collapses
* arrays into pointers; while any integer can be widened to intptr_t
* then cast to void *. */
# define VIR_ADD_CAST(a) ((void *)(intptr_t)(a))
# define VIR_ADD_CAST1(a) \
VIR_ADD_CAST(a)
# define VIR_ADD_CAST2(a, b) \
VIR_ADD_CAST(a), VIR_ADD_CAST(b)
# define VIR_ADD_CAST3(a, b, c) \
VIR_ADD_CAST(a), VIR_ADD_CAST(b), VIR_ADD_CAST(c)
# define VIR_ADD_CAST4(a, b, c, d) \
VIR_ADD_CAST(a), VIR_ADD_CAST(b), VIR_ADD_CAST(c), \
VIR_ADD_CAST(d)
# define VIR_ADD_CAST5(a, b, c, d, e) \
VIR_ADD_CAST(a), VIR_ADD_CAST(b), VIR_ADD_CAST(c), \
VIR_ADD_CAST(d), VIR_ADD_CAST(e)
# define VIR_ADD_CAST6(a, b, c, d, e, f) \
VIR_ADD_CAST(a), VIR_ADD_CAST(b), VIR_ADD_CAST(c), \
VIR_ADD_CAST(d), VIR_ADD_CAST(e), VIR_ADD_CAST(f)
# define VIR_ADD_CAST7(a, b, c, d, e, f, g) \
VIR_ADD_CAST(a), VIR_ADD_CAST(b), VIR_ADD_CAST(c), \
VIR_ADD_CAST(d), VIR_ADD_CAST(e), VIR_ADD_CAST(f), \
VIR_ADD_CAST(g)
# define VIR_ADD_CAST8(a, b, c, d, e, f, g, h) \
VIR_ADD_CAST(a), VIR_ADD_CAST(b), VIR_ADD_CAST(c), \
VIR_ADD_CAST(d), VIR_ADD_CAST(e), VIR_ADD_CAST(f), \
VIR_ADD_CAST(g), VIR_ADD_CAST(h)
# define VIR_ADD_CAST9(a, b, c, d, e, f, g, h, i) \
VIR_ADD_CAST(a), VIR_ADD_CAST(b), VIR_ADD_CAST(c), \
VIR_ADD_CAST(d), VIR_ADD_CAST(e), VIR_ADD_CAST(f), \
VIR_ADD_CAST(g), VIR_ADD_CAST(h), VIR_ADD_CAST(i)
# define VIR_ADD_CASTS(...) \
VIR_ADD_CAST_EXPAND(VIR_ADD_CAST, VIR_COUNT_ARGS(__VA_ARGS__), \
__VA_ARGS__)
# define PROBE_EXPAND(NAME, ARGS) NAME(ARGS)
# define PROBE(NAME, FMT, ...) \
VIR_DEBUG_INT(VIR_LOG_FROM_TRACE, \
__FILE__, __LINE__, __func__, \
#NAME ": " FMT, __VA_ARGS__); \
if (LIBVIRT_ ## NAME ## _ENABLED()) { \
PROBE_EXPAND(LIBVIRT_ ## NAME, \
VIR_ADD_CASTS(__VA_ARGS__)); \
}
# else
# define PROBE(NAME, FMT, ...) \
VIR_DEBUG_INT(VIR_LOG_FROM_TRACE, \
__FILE__, __LINE__, __func__, \
#NAME ": " FMT, __VA_ARGS__);
# endif
/* Specific error values for use in forwarding programs such as
* virt-login-shell; these values match what GNU env does. */
enum {

View File

@ -40,6 +40,7 @@
#include "virfile.h"
#include "virprocess.h"
#include "virobject.h"
#include "virprobe.h"
#include "virstring.h"
#ifdef WITH_DTRACE_PROBES

View File

@ -41,6 +41,7 @@
#include "datatypes.h"
#include "virerror.h"
#include "virjson.h"
#include "virprobe.h"
#include "virstring.h"
#include "cpu/cpu_x86.h"

View File

@ -40,6 +40,7 @@
#include "datatypes.h"
#include "virerror.h"
#include "virbuffer.h"
#include "virprobe.h"
#include "virstring.h"
#ifdef WITH_DTRACE_PROBES

View File

@ -30,6 +30,7 @@
#include "virnetsocket.h"
#include "virkeepaliveprotocol.h"
#include "virkeepalive.h"
#include "virprobe.h"
#define VIR_FROM_THIS VIR_FROM_RPC

View File

@ -36,6 +36,7 @@
#include "virlog.h"
#include "virutil.h"
#include "virerror.h"
#include "virprobe.h"
#include "virstring.h"
#define VIR_FROM_THIS VIR_FROM_RPC

View File

@ -35,6 +35,7 @@
#include "viralloc.h"
#include "virthread.h"
#include "virkeepalive.h"
#include "virprobe.h"
#include "virstring.h"
#include "virutil.h"

View File

@ -51,6 +51,7 @@
#include "virlog.h"
#include "virfile.h"
#include "virthread.h"
#include "virprobe.h"
#include "virprocess.h"
#include "virstring.h"
#include "passfd.h"

View File

@ -39,6 +39,7 @@
#include "virfile.h"
#include "virutil.h"
#include "virlog.h"
#include "virprobe.h"
#include "virthread.h"
#include "configmake.h"

View File

@ -38,6 +38,7 @@
#include "virutil.h"
#include "virfile.h"
#include "virerror.h"
#include "virprobe.h"
#include "virtime.h"
#define EVENT_DEBUG(fmt, ...) VIR_DEBUG(fmt, __VA_ARGS__)

View File

@ -28,6 +28,7 @@
#include "viratomic.h"
#include "virerror.h"
#include "virlog.h"
#include "virprobe.h"
#include "virstring.h"
#define VIR_FROM_THIS VIR_FROM_NONE

100
src/util/virprobe.h Normal file
View File

@ -0,0 +1,100 @@
/*
* virprobe.h: dynamic operation tracing
*
* Copyright (C) 2006-2014 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see
* <http://www.gnu.org/licenses/>.
*
*/
#ifndef __VIR_PROBE_H__
# define __VIR_PROBE_H__
# include "internal.h"
# include "virlog.h"
# if WITH_DTRACE_PROBES
# ifndef LIBVIRT_PROBES_H
# define LIBVIRT_PROBES_H
# include "libvirt_probes.h"
# endif /* LIBVIRT_PROBES_H */
/* Systemtap 1.2 headers have a bug where they cannot handle a
* variable declared with array type. Work around this by casting all
* arguments. This is some gross use of the preprocessor because
* PROBE is a var-arg macro, but it is better than the alternative of
* making all callers to PROBE have to be aware of the issues. And
* hopefully, if we ever add a call to PROBE with other than 9
* end arguments, you can figure out the pattern to extend this hack.
*/
# define VIR_COUNT_ARGS(...) VIR_ARG11(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
# define VIR_ARG11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, ...) _11
# define VIR_ADD_CAST_EXPAND(a, b, ...) VIR_ADD_CAST_PASTE(a, b, __VA_ARGS__)
# define VIR_ADD_CAST_PASTE(a, b, ...) a##b(__VA_ARGS__)
/* The double cast is necessary to silence gcc warnings; any pointer
* can safely go to intptr_t and back to void *, which collapses
* arrays into pointers; while any integer can be widened to intptr_t
* then cast to void *. */
# define VIR_ADD_CAST(a) ((void *)(intptr_t)(a))
# define VIR_ADD_CAST1(a) \
VIR_ADD_CAST(a)
# define VIR_ADD_CAST2(a, b) \
VIR_ADD_CAST(a), VIR_ADD_CAST(b)
# define VIR_ADD_CAST3(a, b, c) \
VIR_ADD_CAST(a), VIR_ADD_CAST(b), VIR_ADD_CAST(c)
# define VIR_ADD_CAST4(a, b, c, d) \
VIR_ADD_CAST(a), VIR_ADD_CAST(b), VIR_ADD_CAST(c), \
VIR_ADD_CAST(d)
# define VIR_ADD_CAST5(a, b, c, d, e) \
VIR_ADD_CAST(a), VIR_ADD_CAST(b), VIR_ADD_CAST(c), \
VIR_ADD_CAST(d), VIR_ADD_CAST(e)
# define VIR_ADD_CAST6(a, b, c, d, e, f) \
VIR_ADD_CAST(a), VIR_ADD_CAST(b), VIR_ADD_CAST(c), \
VIR_ADD_CAST(d), VIR_ADD_CAST(e), VIR_ADD_CAST(f)
# define VIR_ADD_CAST7(a, b, c, d, e, f, g) \
VIR_ADD_CAST(a), VIR_ADD_CAST(b), VIR_ADD_CAST(c), \
VIR_ADD_CAST(d), VIR_ADD_CAST(e), VIR_ADD_CAST(f), \
VIR_ADD_CAST(g)
# define VIR_ADD_CAST8(a, b, c, d, e, f, g, h) \
VIR_ADD_CAST(a), VIR_ADD_CAST(b), VIR_ADD_CAST(c), \
VIR_ADD_CAST(d), VIR_ADD_CAST(e), VIR_ADD_CAST(f), \
VIR_ADD_CAST(g), VIR_ADD_CAST(h)
# define VIR_ADD_CAST9(a, b, c, d, e, f, g, h, i) \
VIR_ADD_CAST(a), VIR_ADD_CAST(b), VIR_ADD_CAST(c), \
VIR_ADD_CAST(d), VIR_ADD_CAST(e), VIR_ADD_CAST(f), \
VIR_ADD_CAST(g), VIR_ADD_CAST(h), VIR_ADD_CAST(i)
# define VIR_ADD_CASTS(...) \
VIR_ADD_CAST_EXPAND(VIR_ADD_CAST, VIR_COUNT_ARGS(__VA_ARGS__), \
__VA_ARGS__)
# define PROBE_EXPAND(NAME, ARGS) NAME(ARGS)
# define PROBE(NAME, FMT, ...) \
VIR_DEBUG_INT(VIR_LOG_FROM_TRACE, \
NULL, __LINE__, __func__, \
#NAME ": " FMT, __VA_ARGS__); \
if (LIBVIRT_ ## NAME ## _ENABLED()) { \
PROBE_EXPAND(LIBVIRT_ ## NAME, \
VIR_ADD_CASTS(__VA_ARGS__)); \
}
# else
# define PROBE(NAME, FMT, ...) \
VIR_DEBUG_INT(VIR_LOG_FROM_TRACE, \
NULL, __LINE__, __func__, \
#NAME ": " FMT, __VA_ARGS__);
# endif
#endif /* __VIR_PROBE_H__ */