[vlc-commits] logger: allow logger as a module
Rémi Denis-Courmont
git at videolan.org
Sun Feb 8 13:57:21 CET 2015
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Feb 8 00:02:45 2015 +0200| [8fa96a463613b4b8b250b08e7201bb58507a81e5] | committer: Rémi Denis-Courmont
logger: allow logger as a module
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=8fa96a463613b4b8b250b08e7201bb58507a81e5
---
include/vlc_interface.h | 14 +-------
include/vlc_messages.h | 11 ++++++
src/libvlc.c | 8 ++---
src/misc/messages.c | 85 ++++++++++++++++++++++++++++++++++++-----------
4 files changed, 82 insertions(+), 36 deletions(-)
diff --git a/include/vlc_interface.h b/include/vlc_interface.h
index b10e374..8839972 100644
--- a/include/vlc_interface.h
+++ b/include/vlc_interface.h
@@ -106,22 +106,10 @@ static inline playlist_t *pl_Get( struct intf_thread_t *intf )
#define pl_CurrentInput(intf) (playlist_CurrentInput(pl_Get(intf)))
/**
- * \defgroup vlc_subscription Log messages subscription
- * These functions deal with log messages.
+ * @ingroup messages
* @{
*/
-/**
- * Message logging callback signature.
- * \param data data pointer as provided to vlc_msg_SetCallback().
- * \param type message type (VLC_MSG_* values from enum vlc_log_type)
- * \param item meta information
- * \param fmt format string
- * \param args format string arguments
- */
-typedef void (*vlc_log_cb) (void *data, int type, const vlc_log_t *item,
- const char *fmt, va_list args);
-
VLC_API void vlc_LogSet(libvlc_int_t *, vlc_log_cb cb, void *data);
/*@}*/
diff --git a/include/vlc_messages.h b/include/vlc_messages.h
index f746f61..b61f71d 100644
--- a/include/vlc_messages.h
+++ b/include/vlc_messages.h
@@ -85,6 +85,17 @@ VLC_API const char *vlc_strerror(int);
VLC_API const char *vlc_strerror_c(int);
/**
+ * Message logging callback signature.
+ * \param data data pointer as provided to vlc_msg_SetCallback().
+ * \param type message type (VLC_MSG_* values from enum vlc_log_type)
+ * \param item meta information
+ * \param fmt format string
+ * \param args format string arguments
+ */
+typedef void (*vlc_log_cb) (void *data, int type, const vlc_log_t *item,
+ const char *fmt, va_list args);
+
+/**
* @}
*/
#endif
diff --git a/src/libvlc.c b/src/libvlc.c
index fe2d308..44f17f5 100644
--- a/src/libvlc.c
+++ b/src/libvlc.c
@@ -168,8 +168,8 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc,
int vlc_optind;
if( config_LoadCmdLine( p_libvlc, i_argc, ppsz_argv, &vlc_optind ) )
{
- module_EndBank (true);
vlc_LogDeinit (p_libvlc);
+ module_EndBank (true);
return VLC_EGENERIC;
}
@@ -194,8 +194,8 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc,
if( module_count <= 1 )
{
msg_Err( p_libvlc, "No plugins found! Check your VLC installation.");
- module_EndBank (true);
vlc_LogDeinit (p_libvlc);
+ module_EndBank (true);
return VLC_ENOMOD;
}
@@ -206,8 +206,8 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc,
if( daemon( 1, 0) != 0 )
{
msg_Err( p_libvlc, "Unable to fork vlc to daemon mode" );
- module_EndBank (true);
vlc_LogDeinit (p_libvlc);
+ module_EndBank (true);
return VLC_ENOMEM;
}
@@ -552,8 +552,8 @@ void libvlc_InternalCleanup( libvlc_int_t *p_libvlc )
config_AutoSaveConfigFile( VLC_OBJECT(p_libvlc) );
/* Free module bank. It is refcounted, so we call this each time */
- module_EndBank (true);
vlc_LogDeinit (p_libvlc);
+ module_EndBank (true);
#if defined(_WIN32) || defined(__OS2__)
system_End( );
#endif
diff --git a/src/misc/messages.c b/src/misc/messages.c
index 4566610..a9b0a29 100644
--- a/src/misc/messages.c
+++ b/src/misc/messages.c
@@ -40,6 +40,7 @@
#include <vlc_common.h>
#include <vlc_interface.h>
#include <vlc_charset.h>
+#include <vlc_modules.h>
#include "../libvlc.h"
#ifdef __ANDROID__
@@ -52,6 +53,7 @@ struct vlc_logger_t
vlc_rwlock_t lock;
vlc_log_cb log;
void *sys;
+ module_t *module;
};
static void vlc_vaLogCallback(libvlc_int_t *vlc, int type,
@@ -355,8 +357,9 @@ static int vlc_LogEarlyOpen(vlc_logger_t *logger)
return 0;
}
-static void vlc_LogEarlyClose(libvlc_int_t *vlc, void *d)
+static void vlc_LogEarlyClose(vlc_logger_t *logger, void *d)
{
+ libvlc_int_t *vlc = logger->p_libvlc;
vlc_logger_early_t *sys = d;
/* Drain early log messages */
@@ -379,6 +382,25 @@ static void vlc_vaLogDiscard(void *d, int type, const vlc_log_t *item,
(void) d; (void) type; (void) item; (void) format; (void) ap;
}
+static int vlc_logger_load(void *func, va_list ap)
+{
+ vlc_log_cb (*activate)(vlc_object_t *, void **) = func;
+ vlc_logger_t *logger = va_arg(ap, vlc_logger_t *);
+ vlc_log_cb *cb = va_arg(ap, vlc_log_cb *);
+ void **sys = va_arg(ap, void **);
+
+ *cb = activate(VLC_OBJECT(logger), sys);
+ return (*cb != NULL) ? VLC_SUCCESS : VLC_EGENERIC;
+}
+
+static void vlc_logger_unload(void *func, va_list ap)
+{
+ void (*deactivate)(vlc_logger_t *) = func;
+ void *sys = va_arg(ap, void *);
+
+ deactivate(sys);
+}
+
/**
* Performs preinitialization of the messages logging subsystem.
*
@@ -422,41 +444,52 @@ int vlc_LogPreinit(libvlc_int_t *vlc)
int vlc_LogInit(libvlc_int_t *vlc)
{
vlc_logger_t *logger = libvlc_priv(vlc)->logger;
- void *early_sys = NULL;
- vlc_log_cb cb = PrintMsg;
- signed char verbosity;
-
if (unlikely(logger == NULL))
return -1;
+ vlc_log_cb cb;
+ void *sys, *early_sys = NULL;
+
+ /* TODO: module configuration item */
+ module_t *module = vlc_module_load(logger, "logger", NULL, false,
+ vlc_logger_load, logger, &cb, &sys);
+ if (module == NULL)
+ {
#ifdef __ANDROID__
- cb = AndroidPrintMsg;
+ cb = AndroidPrintMsg;
#elif defined (HAVE_ISATTY) && !defined (_WIN32)
- if (isatty(STDERR_FILENO) && var_InheritBool(vlc, "color"))
- cb = PrintColorMsg;
+ if (isatty(STDERR_FILENO) && var_InheritBool(vlc, "color"))
+ cb = PrintColorMsg;
#endif
+ else
+ cb = PrintMsg;
- if (var_InheritBool(vlc, "quiet"))
- verbosity = -1;
- else
- {
- const char *str = getenv("VLC_VERBOSE");
+ signed char verbosity;
+
+ if (var_InheritBool(vlc, "quiet"))
+ verbosity = -1;
+ else
+ {
+ const char *str = getenv("VLC_VERBOSE");
- if (str == NULL || sscanf(str, "%hhd", &verbosity) < 1)
- verbosity = var_InheritInteger(vlc, "verbose");
+ if (str == NULL || sscanf(str, "%hhd", &verbosity) < 1)
+ verbosity = var_InheritInteger(vlc, "verbose");
+ }
+ sys = (void *)(intptr_t)verbosity;
}
vlc_rwlock_wrlock(&logger->lock);
-
if (logger->log == vlc_vaLogEarly)
early_sys = logger->sys;
logger->log = cb;
- logger->sys = (void *)(intptr_t)verbosity;
+ logger->sys = sys;
+ assert(logger->module == NULL); /* Only one call to vlc_LogInit()! */
+ logger->module = module;
vlc_rwlock_unlock(&logger->lock);
if (early_sys != NULL)
- vlc_LogEarlyClose(vlc, early_sys);
+ vlc_LogEarlyClose(logger, early_sys);
return 0;
}
@@ -473,14 +506,24 @@ void vlc_LogSet(libvlc_int_t *vlc, vlc_log_cb cb, void *opaque)
if (unlikely(logger == NULL))
return;
+ module_t *module;
+ void *sys;
+
if (cb == NULL)
cb = vlc_vaLogDiscard;
vlc_rwlock_wrlock(&logger->lock);
+ sys = logger->sys;
+ module = logger->module;
+
logger->log = cb;
logger->sys = opaque;
+ logger->module = NULL;
vlc_rwlock_unlock(&logger->lock);
+ if (module != NULL)
+ vlc_module_unload(module, vlc_logger_unload, sys);
+
/* Announce who we are */
msg_Dbg (vlc, "VLC media player - %s", VERSION_MESSAGE);
msg_Dbg (vlc, "%s", COPYRIGHT_MESSAGE);
@@ -495,13 +538,17 @@ void vlc_LogDeinit(libvlc_int_t *vlc)
if (unlikely(logger == NULL))
return;
+ if (logger->module != NULL)
+ vlc_module_unload(logger->module, vlc_logger_unload, logger->sys);
+ else
/* Flush early log messages (corner case: no call to vlc_LogInit()) */
if (logger->log == vlc_vaLogEarly)
{
logger->log = vlc_vaLogDiscard;
- vlc_LogEarlyClose(vlc, logger->sys);
+ vlc_LogEarlyClose(logger, logger->sys);
}
vlc_rwlock_destroy(&logger->lock);
vlc_object_release(logger);
+ libvlc_priv(vlc)->logger = NULL;
}
More information about the vlc-commits
mailing list