[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