* [RFC v3 0/2] Fix debug messages logging from non-built-in plugins
@ 2011-08-11 13:10 Szymon Janc
2011-08-11 13:10 ` [RFC v3 1/2] Add external dummy plugin for testing Szymon Janc
2011-08-11 13:10 ` [RFC v3 2/2] Fix debug messages logging from non-built-in plugins Szymon Janc
0 siblings, 2 replies; 5+ messages in thread
From: Szymon Janc @ 2011-08-11 13:10 UTC (permalink / raw)
To: linux-bluetooth; +Cc: par-gunnar.p.hjalmdahl, ulrik.lauren, Szymon Janc
Main change is to make stuff 'automatic' in order to minimize linker cruft
in autotools files.
This implementation suffers only one limitation: at least 1 entry must
exist in __debug section in order to link plugin. Possible solution to
this is to add dummy entry.
But this might be not a big issue as current implementation suffers same
problem: bluetoothd will not link if DBG macro would be empty and it is
very unlikely to have plugin with no debug messages at all.
Comments are welcome.
Szymon Janc (2):
Add external dummy plugin for testing
Fix debug messages logging from non-built-in plugins
Makefile.am | 7 +++++++
plugins/external-dummy.c | 42 ++++++++++++++++++++++++++++++++++++++++++
src/log.c | 38 +++++++++++++++++++++++++++++++-------
src/log.h | 8 ++++++++
src/plugin.h | 15 +++++++++++++++
5 files changed, 103 insertions(+), 7 deletions(-)
create mode 100644 plugins/external-dummy.c
--
on behalf of ST-Ericsson
^ permalink raw reply [flat|nested] 5+ messages in thread
* [RFC v3 1/2] Add external dummy plugin for testing
2011-08-11 13:10 [RFC v3 0/2] Fix debug messages logging from non-built-in plugins Szymon Janc
@ 2011-08-11 13:10 ` Szymon Janc
2011-08-14 21:12 ` Marcel Holtmann
2011-08-11 13:10 ` [RFC v3 2/2] Fix debug messages logging from non-built-in plugins Szymon Janc
1 sibling, 1 reply; 5+ messages in thread
From: Szymon Janc @ 2011-08-11 13:10 UTC (permalink / raw)
To: linux-bluetooth; +Cc: par-gunnar.p.hjalmdahl, ulrik.lauren, Szymon Janc
---
Makefile.am | 7 +++++++
plugins/external-dummy.c | 42 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 49 insertions(+), 0 deletions(-)
create mode 100644 plugins/external-dummy.c
diff --git a/Makefile.am b/Makefile.am
index 68380d9..c370b55 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -258,6 +258,13 @@ builtin_modules += dbusoob
builtin_sources += plugins/dbusoob.c
endif
+if MAINTAINER_MODE
+plugin_LTLIBRARIES += plugins/external-dummy.la
+plugins_external_dummy_la_SOURCES = plugins/external-dummy.c
+plugins_external_dummy_la_LDFLAGS = -module -avoid-version -no-undefined
+plugins_external_dummy_la_CFLAGS = -fvisibility=hidden
+endif
+
sbin_PROGRAMS += src/bluetoothd
src_bluetoothd_SOURCES = $(gdbus_sources) $(builtin_sources) \
diff --git a/plugins/external-dummy.c b/plugins/external-dummy.c
new file mode 100644
index 0000000..c6f5a36
--- /dev/null
+++ b/plugins/external-dummy.c
@@ -0,0 +1,42 @@
+/*
+ *
+ * BlueZ - Bluetooth protocol stack for Linux
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "plugin.h"
+#include "log.h"
+
+static int dummy_init(void)
+{
+ DBG("");
+
+ return 0;
+}
+
+static void dummy_exit(void)
+{
+ DBG("");
+}
+
+BLUETOOTH_PLUGIN_DEFINE(external_dummy, VERSION,
+ BLUETOOTH_PLUGIN_PRIORITY_LOW, dummy_init, dummy_exit)
+
--
on behalf of ST-Ericsson
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [RFC v3 2/2] Fix debug messages logging from non-built-in plugins
2011-08-11 13:10 [RFC v3 0/2] Fix debug messages logging from non-built-in plugins Szymon Janc
2011-08-11 13:10 ` [RFC v3 1/2] Add external dummy plugin for testing Szymon Janc
@ 2011-08-11 13:10 ` Szymon Janc
2011-08-14 21:59 ` Marcel Holtmann
1 sibling, 1 reply; 5+ messages in thread
From: Szymon Janc @ 2011-08-11 13:10 UTC (permalink / raw)
To: linux-bluetooth; +Cc: par-gunnar.p.hjalmdahl, ulrik.lauren, Szymon Janc
---
src/log.c | 38 +++++++++++++++++++++++++++++++-------
src/log.h | 8 ++++++++
src/plugin.h | 15 +++++++++++++++
3 files changed, 54 insertions(+), 7 deletions(-)
diff --git a/src/log.c b/src/log.c
index 2c492e9..ab4f92d 100644
--- a/src/log.c
+++ b/src/log.c
@@ -68,8 +68,10 @@ void btd_debug(const char *format, ...)
extern struct btd_debug_desc __start___debug[];
extern struct btd_debug_desc __stop___debug[];
+static struct btd_debug_section debug_section;
static gchar **enabled = NULL;
+static GSList *debug_sections = NULL;
static gboolean is_enabled(struct btd_debug_desc *desc)
{
@@ -88,23 +90,27 @@ static gboolean is_enabled(struct btd_debug_desc *desc)
void __btd_toggle_debug(void)
{
- struct btd_debug_desc *desc;
+ GSList *l;
+
+ for (l = debug_sections; l; l = l->next) {
+ struct btd_debug_section *s = l->data;
+ struct btd_debug_desc *desc;
- for (desc = __start___debug; desc < __stop___debug; desc++)
- desc->flags |= BTD_DEBUG_FLAG_PRINT;
+ for (desc = s->start; desc < s->stop; desc++)
+ desc->flags |= BTD_DEBUG_FLAG_PRINT;
+ }
}
void __btd_log_init(const char *debug, int detach)
{
int option = LOG_NDELAY | LOG_PID;
- struct btd_debug_desc *desc;
if (debug != NULL)
enabled = g_strsplit_set(debug, ":, ", 0);
- for (desc = __start___debug; desc < __stop___debug; desc++)
- if (is_enabled(desc))
- desc->flags |= BTD_DEBUG_FLAG_PRINT;
+ debug_section.start = __start___debug;
+ debug_section.stop = __stop___debug;
+ btd_log_add(&debug_section);
if (!detach)
option |= LOG_PERROR;
@@ -116,7 +122,25 @@ void __btd_log_init(const char *debug, int detach)
void __btd_log_cleanup(void)
{
+ btd_log_remove(&debug_section);
+
closelog();
g_strfreev(enabled);
}
+
+void btd_log_add(struct btd_debug_section *s)
+{
+ struct btd_debug_desc *desc;
+
+ for (desc = s->start; desc < s->stop; desc++)
+ if (is_enabled(desc))
+ desc->flags |= BTD_DEBUG_FLAG_PRINT;
+
+ debug_sections = g_slist_prepend(debug_sections, s);
+}
+
+void btd_log_remove(struct btd_debug_section *s)
+{
+ debug_sections = g_slist_remove(debug_sections, s);
+}
diff --git a/src/log.h b/src/log.h
index 78bbdd8..960c05c 100644
--- a/src/log.h
+++ b/src/log.h
@@ -37,6 +37,14 @@ struct btd_debug_desc {
unsigned int flags;
} __attribute__((aligned(8)));
+struct btd_debug_section {
+ struct btd_debug_desc *start;
+ struct btd_debug_desc *stop;
+};
+
+void btd_log_add(struct btd_debug_section *s);
+void btd_log_remove(struct btd_debug_section *s);
+
/**
* DBG:
* @fmt: format string
diff --git a/src/plugin.h b/src/plugin.h
index 30bd415..5556cf5 100644
--- a/src/plugin.h
+++ b/src/plugin.h
@@ -39,6 +39,21 @@ struct bluetooth_plugin_desc {
};
#else
#define BLUETOOTH_PLUGIN_DEFINE(name, version, priority, init, exit) \
+ extern struct btd_debug_desc __start___debug[] \
+ __attribute__ ((visibility("hidden"))); \
+ extern struct btd_debug_desc __stop___debug[] \
+ __attribute__ ((visibility("hidden"))); \
+ static struct btd_debug_section __ds; \
+ static void __attribute__((constructor)) log_init(void) \
+ { \
+ __ds.start = __start___debug; \
+ __ds.stop = __stop___debug; \
+ btd_log_add(&__ds); \
+ } \
+ static void __attribute__((destructor)) log_fini(void) \
+ { \
+ btd_log_remove(&__ds); \
+ } \
extern struct bluetooth_plugin_desc bluetooth_plugin_desc \
__attribute__ ((visibility("default"))); \
struct bluetooth_plugin_desc bluetooth_plugin_desc = { \
--
on behalf of ST-Ericsson
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [RFC v3 1/2] Add external dummy plugin for testing
2011-08-11 13:10 ` [RFC v3 1/2] Add external dummy plugin for testing Szymon Janc
@ 2011-08-14 21:12 ` Marcel Holtmann
0 siblings, 0 replies; 5+ messages in thread
From: Marcel Holtmann @ 2011-08-14 21:12 UTC (permalink / raw)
To: Szymon Janc; +Cc: linux-bluetooth, par-gunnar.p.hjalmdahl, ulrik.lauren
Hi Szymon,
> Makefile.am | 7 +++++++
> plugins/external-dummy.c | 42 ++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 49 insertions(+), 0 deletions(-)
> create mode 100644 plugins/external-dummy.c
I prefer if patches are actually tested if the apply cleanly:
Applying: Add external dummy plugin for testing
/data/devel/bluez/.git/rebase-apply/patch:30: new blank line at EOF.
+
fatal: 1 line adds whitespace errors.
Since my patch and git foo is reaching guru status, I fixed this up for
you ;)
Regards
Marcel
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [RFC v3 2/2] Fix debug messages logging from non-built-in plugins
2011-08-11 13:10 ` [RFC v3 2/2] Fix debug messages logging from non-built-in plugins Szymon Janc
@ 2011-08-14 21:59 ` Marcel Holtmann
0 siblings, 0 replies; 5+ messages in thread
From: Marcel Holtmann @ 2011-08-14 21:59 UTC (permalink / raw)
To: Szymon Janc; +Cc: linux-bluetooth, par-gunnar.p.hjalmdahl, ulrik.lauren
Hi Szymon,
> src/log.c | 38 +++++++++++++++++++++++++++++++-------
> src/log.h | 8 ++++++++
> src/plugin.h | 15 +++++++++++++++
> 3 files changed, 54 insertions(+), 7 deletions(-)
>
> diff --git a/src/log.c b/src/log.c
> index 2c492e9..ab4f92d 100644
> --- a/src/log.c
> +++ b/src/log.c
> @@ -68,8 +68,10 @@ void btd_debug(const char *format, ...)
>
> extern struct btd_debug_desc __start___debug[];
> extern struct btd_debug_desc __stop___debug[];
> +static struct btd_debug_section debug_section;
>
> static gchar **enabled = NULL;
> +static GSList *debug_sections = NULL;
>
> static gboolean is_enabled(struct btd_debug_desc *desc)
> {
> @@ -88,23 +90,27 @@ static gboolean is_enabled(struct btd_debug_desc *desc)
>
> void __btd_toggle_debug(void)
> {
> - struct btd_debug_desc *desc;
> + GSList *l;
> +
> + for (l = debug_sections; l; l = l->next) {
> + struct btd_debug_section *s = l->data;
> + struct btd_debug_desc *desc;
>
> - for (desc = __start___debug; desc < __stop___debug; desc++)
> - desc->flags |= BTD_DEBUG_FLAG_PRINT;
> + for (desc = s->start; desc < s->stop; desc++)
> + desc->flags |= BTD_DEBUG_FLAG_PRINT;
> + }
> }
>
> void __btd_log_init(const char *debug, int detach)
> {
> int option = LOG_NDELAY | LOG_PID;
> - struct btd_debug_desc *desc;
>
> if (debug != NULL)
> enabled = g_strsplit_set(debug, ":, ", 0);
>
> - for (desc = __start___debug; desc < __stop___debug; desc++)
> - if (is_enabled(desc))
> - desc->flags |= BTD_DEBUG_FLAG_PRINT;
> + debug_section.start = __start___debug;
> + debug_section.stop = __stop___debug;
> + btd_log_add(&debug_section);
>
> if (!detach)
> option |= LOG_PERROR;
> @@ -116,7 +122,25 @@ void __btd_log_init(const char *debug, int detach)
>
> void __btd_log_cleanup(void)
> {
> + btd_log_remove(&debug_section);
> +
> closelog();
>
> g_strfreev(enabled);
> }
> +
> +void btd_log_add(struct btd_debug_section *s)
> +{
> + struct btd_debug_desc *desc;
> +
> + for (desc = s->start; desc < s->stop; desc++)
> + if (is_enabled(desc))
> + desc->flags |= BTD_DEBUG_FLAG_PRINT;
> +
> + debug_sections = g_slist_prepend(debug_sections, s);
> +}
> +
> +void btd_log_remove(struct btd_debug_section *s)
> +{
> + debug_sections = g_slist_remove(debug_sections, s);
> +}
> diff --git a/src/log.h b/src/log.h
> index 78bbdd8..960c05c 100644
> --- a/src/log.h
> +++ b/src/log.h
> @@ -37,6 +37,14 @@ struct btd_debug_desc {
> unsigned int flags;
> } __attribute__((aligned(8)));
>
> +struct btd_debug_section {
> + struct btd_debug_desc *start;
> + struct btd_debug_desc *stop;
> +};
> +
> +void btd_log_add(struct btd_debug_section *s);
> +void btd_log_remove(struct btd_debug_section *s);
> +
> /**
> * DBG:
> * @fmt: format string
> diff --git a/src/plugin.h b/src/plugin.h
> index 30bd415..5556cf5 100644
> --- a/src/plugin.h
> +++ b/src/plugin.h
> @@ -39,6 +39,21 @@ struct bluetooth_plugin_desc {
> };
> #else
> #define BLUETOOTH_PLUGIN_DEFINE(name, version, priority, init, exit) \
> + extern struct btd_debug_desc __start___debug[] \
> + __attribute__ ((visibility("hidden"))); \
> + extern struct btd_debug_desc __stop___debug[] \
> + __attribute__ ((visibility("hidden"))); \
> + static struct btd_debug_section __ds; \
> + static void __attribute__((constructor)) log_init(void) \
> + { \
> + __ds.start = __start___debug; \
> + __ds.stop = __stop___debug; \
> + btd_log_add(&__ds); \
> + } \
> + static void __attribute__((destructor)) log_fini(void) \
> + { \
> + btd_log_remove(&__ds); \
> + } \
> extern struct bluetooth_plugin_desc bluetooth_plugin_desc \
> __attribute__ ((visibility("default"))); \
> struct bluetooth_plugin_desc bluetooth_plugin_desc = { \
after looking into this struct, I got the feeling that this is all a bit
too complicated. So I took rolled my own patch to support debug messages
from external plugins.
As far as I tested it works fine. Only exception is that you can not
toggle debug messages of external plugins via SIGUSR2, but that is
actually acceptable to me.
Have a look at this and see if it works for you as well.
Regards
Marcel
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2011-08-14 21:59 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-08-11 13:10 [RFC v3 0/2] Fix debug messages logging from non-built-in plugins Szymon Janc
2011-08-11 13:10 ` [RFC v3 1/2] Add external dummy plugin for testing Szymon Janc
2011-08-14 21:12 ` Marcel Holtmann
2011-08-11 13:10 ` [RFC v3 2/2] Fix debug messages logging from non-built-in plugins Szymon Janc
2011-08-14 21:59 ` Marcel Holtmann
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox