Commit 8fa96a46 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

logger: allow logger as a module

parent add015be
...@@ -106,22 +106,10 @@ static inline playlist_t *pl_Get( struct intf_thread_t *intf ) ...@@ -106,22 +106,10 @@ static inline playlist_t *pl_Get( struct intf_thread_t *intf )
#define pl_CurrentInput(intf) (playlist_CurrentInput(pl_Get(intf))) #define pl_CurrentInput(intf) (playlist_CurrentInput(pl_Get(intf)))
/** /**
* \defgroup vlc_subscription Log messages subscription * @ingroup messages
* These functions deal with log 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); VLC_API void vlc_LogSet(libvlc_int_t *, vlc_log_cb cb, void *data);
/*@}*/ /*@}*/
......
...@@ -84,6 +84,17 @@ VLC_API void vlc_vaLog(vlc_object_t *, int, ...@@ -84,6 +84,17 @@ VLC_API void vlc_vaLog(vlc_object_t *, int,
VLC_API const char *vlc_strerror(int); VLC_API const char *vlc_strerror(int);
VLC_API const char *vlc_strerror_c(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);
/** /**
* @} * @}
*/ */
......
...@@ -168,8 +168,8 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, ...@@ -168,8 +168,8 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc,
int vlc_optind; int vlc_optind;
if( config_LoadCmdLine( p_libvlc, i_argc, ppsz_argv, &vlc_optind ) ) if( config_LoadCmdLine( p_libvlc, i_argc, ppsz_argv, &vlc_optind ) )
{ {
module_EndBank (true);
vlc_LogDeinit (p_libvlc); vlc_LogDeinit (p_libvlc);
module_EndBank (true);
return VLC_EGENERIC; return VLC_EGENERIC;
} }
...@@ -194,8 +194,8 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, ...@@ -194,8 +194,8 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc,
if( module_count <= 1 ) if( module_count <= 1 )
{ {
msg_Err( p_libvlc, "No plugins found! Check your VLC installation."); msg_Err( p_libvlc, "No plugins found! Check your VLC installation.");
module_EndBank (true);
vlc_LogDeinit (p_libvlc); vlc_LogDeinit (p_libvlc);
module_EndBank (true);
return VLC_ENOMOD; return VLC_ENOMOD;
} }
...@@ -206,8 +206,8 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, ...@@ -206,8 +206,8 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc,
if( daemon( 1, 0) != 0 ) if( daemon( 1, 0) != 0 )
{ {
msg_Err( p_libvlc, "Unable to fork vlc to daemon mode" ); msg_Err( p_libvlc, "Unable to fork vlc to daemon mode" );
module_EndBank (true);
vlc_LogDeinit (p_libvlc); vlc_LogDeinit (p_libvlc);
module_EndBank (true);
return VLC_ENOMEM; return VLC_ENOMEM;
} }
...@@ -552,8 +552,8 @@ void libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) ...@@ -552,8 +552,8 @@ void libvlc_InternalCleanup( libvlc_int_t *p_libvlc )
config_AutoSaveConfigFile( VLC_OBJECT(p_libvlc) ); config_AutoSaveConfigFile( VLC_OBJECT(p_libvlc) );
/* Free module bank. It is refcounted, so we call this each time */ /* Free module bank. It is refcounted, so we call this each time */
module_EndBank (true);
vlc_LogDeinit (p_libvlc); vlc_LogDeinit (p_libvlc);
module_EndBank (true);
#if defined(_WIN32) || defined(__OS2__) #if defined(_WIN32) || defined(__OS2__)
system_End( ); system_End( );
#endif #endif
......
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
#include <vlc_common.h> #include <vlc_common.h>
#include <vlc_interface.h> #include <vlc_interface.h>
#include <vlc_charset.h> #include <vlc_charset.h>
#include <vlc_modules.h>
#include "../libvlc.h" #include "../libvlc.h"
#ifdef __ANDROID__ #ifdef __ANDROID__
...@@ -52,6 +53,7 @@ struct vlc_logger_t ...@@ -52,6 +53,7 @@ struct vlc_logger_t
vlc_rwlock_t lock; vlc_rwlock_t lock;
vlc_log_cb log; vlc_log_cb log;
void *sys; void *sys;
module_t *module;
}; };
static void vlc_vaLogCallback(libvlc_int_t *vlc, int type, static void vlc_vaLogCallback(libvlc_int_t *vlc, int type,
...@@ -355,8 +357,9 @@ static int vlc_LogEarlyOpen(vlc_logger_t *logger) ...@@ -355,8 +357,9 @@ static int vlc_LogEarlyOpen(vlc_logger_t *logger)
return 0; 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; vlc_logger_early_t *sys = d;
/* Drain early log messages */ /* Drain early log messages */
...@@ -379,6 +382,25 @@ static void vlc_vaLogDiscard(void *d, int type, const vlc_log_t *item, ...@@ -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; (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. * Performs preinitialization of the messages logging subsystem.
* *
...@@ -422,19 +444,27 @@ int vlc_LogPreinit(libvlc_int_t *vlc) ...@@ -422,19 +444,27 @@ int vlc_LogPreinit(libvlc_int_t *vlc)
int vlc_LogInit(libvlc_int_t *vlc) int vlc_LogInit(libvlc_int_t *vlc)
{ {
vlc_logger_t *logger = libvlc_priv(vlc)->logger; vlc_logger_t *logger = libvlc_priv(vlc)->logger;
void *early_sys = NULL;
vlc_log_cb cb = PrintMsg;
signed char verbosity;
if (unlikely(logger == NULL)) if (unlikely(logger == NULL))
return -1; 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__ #ifdef __ANDROID__
cb = AndroidPrintMsg; cb = AndroidPrintMsg;
#elif defined (HAVE_ISATTY) && !defined (_WIN32) #elif defined (HAVE_ISATTY) && !defined (_WIN32)
if (isatty(STDERR_FILENO) && var_InheritBool(vlc, "color")) if (isatty(STDERR_FILENO) && var_InheritBool(vlc, "color"))
cb = PrintColorMsg; cb = PrintColorMsg;
#endif #endif
else
cb = PrintMsg;
signed char verbosity;
if (var_InheritBool(vlc, "quiet")) if (var_InheritBool(vlc, "quiet"))
verbosity = -1; verbosity = -1;
...@@ -445,18 +475,21 @@ int vlc_LogInit(libvlc_int_t *vlc) ...@@ -445,18 +475,21 @@ int vlc_LogInit(libvlc_int_t *vlc)
if (str == NULL || sscanf(str, "%hhd", &verbosity) < 1) if (str == NULL || sscanf(str, "%hhd", &verbosity) < 1)
verbosity = var_InheritInteger(vlc, "verbose"); verbosity = var_InheritInteger(vlc, "verbose");
} }
sys = (void *)(intptr_t)verbosity;
}
vlc_rwlock_wrlock(&logger->lock); vlc_rwlock_wrlock(&logger->lock);
if (logger->log == vlc_vaLogEarly) if (logger->log == vlc_vaLogEarly)
early_sys = logger->sys; early_sys = logger->sys;
logger->log = cb; 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); vlc_rwlock_unlock(&logger->lock);
if (early_sys != NULL) if (early_sys != NULL)
vlc_LogEarlyClose(vlc, early_sys); vlc_LogEarlyClose(logger, early_sys);
return 0; return 0;
} }
...@@ -473,14 +506,24 @@ void vlc_LogSet(libvlc_int_t *vlc, vlc_log_cb cb, void *opaque) ...@@ -473,14 +506,24 @@ void vlc_LogSet(libvlc_int_t *vlc, vlc_log_cb cb, void *opaque)
if (unlikely(logger == NULL)) if (unlikely(logger == NULL))
return; return;
module_t *module;
void *sys;
if (cb == NULL) if (cb == NULL)
cb = vlc_vaLogDiscard; cb = vlc_vaLogDiscard;
vlc_rwlock_wrlock(&logger->lock); vlc_rwlock_wrlock(&logger->lock);
sys = logger->sys;
module = logger->module;
logger->log = cb; logger->log = cb;
logger->sys = opaque; logger->sys = opaque;
logger->module = NULL;
vlc_rwlock_unlock(&logger->lock); vlc_rwlock_unlock(&logger->lock);
if (module != NULL)
vlc_module_unload(module, vlc_logger_unload, sys);
/* Announce who we are */ /* Announce who we are */
msg_Dbg (vlc, "VLC media player - %s", VERSION_MESSAGE); msg_Dbg (vlc, "VLC media player - %s", VERSION_MESSAGE);
msg_Dbg (vlc, "%s", COPYRIGHT_MESSAGE); msg_Dbg (vlc, "%s", COPYRIGHT_MESSAGE);
...@@ -495,13 +538,17 @@ void vlc_LogDeinit(libvlc_int_t *vlc) ...@@ -495,13 +538,17 @@ void vlc_LogDeinit(libvlc_int_t *vlc)
if (unlikely(logger == NULL)) if (unlikely(logger == NULL))
return; 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()) */ /* Flush early log messages (corner case: no call to vlc_LogInit()) */
if (logger->log == vlc_vaLogEarly) if (logger->log == vlc_vaLogEarly)
{ {
logger->log = vlc_vaLogDiscard; logger->log = vlc_vaLogDiscard;
vlc_LogEarlyClose(vlc, logger->sys); vlc_LogEarlyClose(logger, logger->sys);
} }
vlc_rwlock_destroy(&logger->lock); vlc_rwlock_destroy(&logger->lock);
vlc_object_release(logger); vlc_object_release(logger);
libvlc_priv(vlc)->logger = NULL;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment