diff options
Diffstat (limited to 'src/dbus/qdbus_symbols_p.h')
-rw-r--r-- | src/dbus/qdbus_symbols_p.h | 92 |
1 files changed, 84 insertions, 8 deletions
diff --git a/src/dbus/qdbus_symbols_p.h b/src/dbus/qdbus_symbols_p.h index 4bec3af490..cec8ad62cb 100644 --- a/src/dbus/qdbus_symbols_p.h +++ b/src/dbus/qdbus_symbols_p.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the QtDBus module of the Qt Toolkit. ** @@ -10,9 +10,9 @@ ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser @@ -23,8 +23,8 @@ ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ @@ -64,14 +64,90 @@ void (*qdbus_resolve_conditionally(const char *name))(); // doesn't print a warn void (*qdbus_resolve_me(const char *name))(); // prints a warning bool qdbus_loadLibDBus(); +//# define TRACE_DBUS_CALLS +# ifdef TRACE_DBUS_CALLS +namespace QtDBusCallTracing { +struct TraceDBusCall +{ + struct ThreadData { + TraceDBusCall *ptr; + int level; + bool finishedPrinted; + }; + + static inline ThreadData &td() + { + static thread_local ThreadData value; + return value; + } + + ThreadData savedData; + QDebug s; + TraceDBusCall(QDebug s, const char *fname) + : savedData(td()), s(s.nospace() << QByteArray(savedData.level * 3, ' ').constData() << fname) + { + if (savedData.ptr && !savedData.finishedPrinted) { + savedData.ptr->s << " ...unfinished"; + savedData.ptr->s = qDebug().nospace() << QByteArray(savedData.level * 3 - 3, ' ').constData(); + savedData.finishedPrinted = true; + } + ThreadData &data = td(); + data.ptr = this; + data.level++; + data.finishedPrinted = false; + } + ~TraceDBusCall() + { + td() = savedData; + } + + void operator()() { s << ")"; } + template <typename... Args> void operator()(const char *arg1, Args &&... args) + { + s << '"' << arg1 << '"'; + if (sizeof...(args)) + s << ", "; + operator()(args...); + } + template <typename Arg1, typename... Args> void operator()(Arg1 &&arg1, Args &&... args) + { + s << arg1; + if (sizeof...(args)) + s << ", "; + operator()(args...); + } +}; +template <typename T> T operator,(TraceDBusCall &&tc, T &&ret) +{ + tc.s << " = " << ret; + return ret; +} +inline const char *operator,(TraceDBusCall &&tc, const char *ret) +{ + tc.s << " = \"" << ret << '"'; + return ret; +} + +template <typename T> struct TraceReturn { typedef TraceDBusCall Type; }; +template <> struct TraceReturn<void> { typedef void Type; }; +} + +# define DEBUGCALL(name, argcall) QtDBusCallTracing::TraceDBusCall tc(qDebug(), name "("); tc argcall +# define DEBUGRET(ret) (QtDBusCallTracing::TraceReturn<ret>::Type) tc , +# else +# define DEBUGCALL(name, argcall) +# define DEBUGRET(ret) +# endif + # define DEFINEFUNC(ret, func, args, argcall, funcret) \ typedef ret (* _q_PTR_##func) args; \ static inline ret q_##func args \ { \ static _q_PTR_##func ptr; \ + DEBUGCALL(#func, argcall); \ if (!ptr) \ ptr = (_q_PTR_##func) qdbus_resolve_me(#func); \ - funcret ptr argcall; \ + funcret DEBUGRET(ret) ptr argcall; \ } #else // defined QT_LINKED_LIBDBUS |