]> git.sesse.net Git - vlc/commitdiff
Hide message bank layout and cleanup a bit
authorRémi Denis-Courmont <remi@remlab.net>
Sat, 6 Feb 2010 16:18:30 +0000 (18:18 +0200)
committerRémi Denis-Courmont <remi@remlab.net>
Sat, 6 Feb 2010 16:21:32 +0000 (18:21 +0200)
Also fix a potential crash in case of stale subscriber
(print debug message to stderr).

include/vlc_messages.h
src/libvlc.c
src/libvlc.h
src/libvlccore.sym
src/misc/messages.c

index 8fa89768fd79bbdd4e8cd7570d8975e568474984..b5bb64a488cb83adcb303c289afe201e78d53037 100644 (file)
@@ -116,10 +116,11 @@ VLC_EXPORT( msg_subscription_t*, msg_Subscribe, ( libvlc_int_t *, msg_callback_t
 VLC_EXPORT( void, msg_Unsubscribe, ( msg_subscription_t * ) );
 
 /* Enable or disable a certain object debug messages */
-#define msg_EnableObjectPrinting(a,b) __msg_EnableObjectPrinting(VLC_OBJECT(a),b)
-#define msg_DisableObjectPrinting(a,b) __msg_DisableObjectPrinting(VLC_OBJECT(a),b)
-VLC_EXPORT( void, __msg_EnableObjectPrinting, ( vlc_object_t *, const char * psz_object ) );
-VLC_EXPORT( void, __msg_DisableObjectPrinting, ( vlc_object_t *, const char * psz_object ) );
+VLC_EXPORT( void, msg_EnableObjectPrinting, ( vlc_object_t *, const char * psz_object ) );
+#define msg_EnableObjectPrinting(a,b) msg_EnableObjectPrinting(VLC_OBJECT(a),b)
+VLC_EXPORT( void, msg_DisableObjectPrinting, ( vlc_object_t *, const char * psz_object ) );
+#define msg_DisableObjectPrinting(a,b) msg_DisableObjectPrinting(VLC_OBJECT(a),b)
+
 
 /**
  * @}
index c59c3b43b0edbd4947e6f66d59c959f7cf7b961b..eadbfb8c15763285e3afb22bb485b45d846a0780 100644 (file)
@@ -255,7 +255,9 @@ libvlc_int_t * libvlc_InternalCreate( void )
     priv->p_vlm = NULL;
 
     /* Initialize message queue */
-    msg_Create( p_libvlc );
+    priv->msg_bank = msg_Create ();
+    if (unlikely(priv->msg_bank == NULL))
+        goto error;
 
     /* Find verbosity from VLC_VERBOSE environment variable */
     psz_env = getenv( "VLC_VERBOSE" );
@@ -273,6 +275,9 @@ libvlc_int_t * libvlc_InternalCreate( void )
     vlc_mutex_init( &priv->timer_lock );
 
     return p_libvlc;
+error:
+    vlc_object_release (p_libvlc);
+    return NULL;
 }
 
 /**
@@ -1070,7 +1075,7 @@ void libvlc_InternalDestroy( libvlc_int_t *p_libvlc )
     }
     vlc_mutex_unlock( &global_lock );
 
-    msg_Destroy( p_libvlc );
+    msg_Destroy (priv->msg_bank);
 
     /* Destroy mutexes */
     vlc_mutex_destroy( &priv->timer_lock );
index 06c955c95d2b410b05fe2354e933a58bf40de4e8..303be866115cb4270df8df5efd569e239cd70726 100644 (file)
@@ -84,28 +84,10 @@ bool vlc_CPU_CheckPluginDir (const char *name);
  * Message/logging stuff
  */
 
-/**
- * Store all data required by messages interfaces.
- */
-typedef struct msg_bank_t
-{
-    /** Message queue lock */
-    vlc_rwlock_t lock;
-
-    /* Subscribers */
-    int i_sub;
-    msg_subscription_t **pp_sub;
-
-    /* Logfile for WinCE */
-#ifdef UNDER_CE
-    FILE *logfile;
-#endif
-
-    locale_t locale;
-} msg_bank_t;
+typedef struct msg_bank_t msg_bank_t;
 
-void msg_Create  (libvlc_int_t *);
-void msg_Destroy (libvlc_int_t *);
+msg_bank_t *msg_Create (void);
+void msg_Destroy (msg_bank_t *);
 
 /** Internal message stack context */
 void msg_StackSet ( int, const char*, ... );
@@ -211,11 +193,9 @@ typedef struct libvlc_priv_t
     bool               playlist_active;
 
     /* Messages */
-    msg_bank_t         msg_bank;    ///< The message bank
+    msg_bank_t        *msg_bank;    ///< The message bank
     int                i_verbose;   ///< info messages
-    vlc_dictionary_t   msg_enabled_objects; ///< Enabled objects
     bool               b_color;     ///< color messages?
-    bool               msg_all_objects_enabled; ///< Should we print all objects?
 
     /* Timer stats */
     bool               b_stats;     ///< Whether to collect stats
index 663d775a89009a432dca35bb6f8d62faf4f8dd3a..591fe9c22891cf28bf9f9400f52562b7b5066a5d 100644 (file)
@@ -252,8 +252,8 @@ __module_need
 module_provides
 module_release
 __module_unneed
-__msg_DisableObjectPrinting
-__msg_EnableObjectPrinting
+msg_DisableObjectPrinting
+msg_EnableObjectPrinting
 __msg_Generic
 __msg_GenericVa
 msg_Subscribe
index 45af2e510648b1e392978f4eda4bfe57d8a46126..f35debc3aa92e137165360320499f040ff90d163 100644 (file)
@@ -81,7 +81,7 @@ static uintptr_t banks = 0;
 #define QUEUE priv->msg_bank
 static inline msg_bank_t *libvlc_bank (libvlc_int_t *inst)
 {
-    return &(libvlc_priv (inst))->msg_bank;
+    return (libvlc_priv (inst))->msg_bank;
 }
 
 /*****************************************************************************
@@ -93,21 +93,42 @@ static void PrintMsg ( vlc_object_t *, msg_item_t * );
 
 static vlc_mutex_t msg_stack_lock = VLC_STATIC_MUTEX;
 
+/**
+ * Store all data required by messages interfaces.
+ */
+struct msg_bank_t
+{
+    /** Message queue lock */
+    vlc_rwlock_t lock;
+
+    /* Subscribers */
+    int i_sub;
+    msg_subscription_t **pp_sub;
+
+    /* Logfile for WinCE */
+#ifdef UNDER_CE
+    FILE *logfile;
+#endif
+
+    locale_t locale; /**< C locale for error messages */
+    vlc_dictionary_t enabled_objects; ///< Enabled objects
+    bool all_objects_enabled; ///< Should we print all objects?
+};
+
 /**
  * Initialize messages queues
  * This function initializes all message queues
  */
-void msg_Create (libvlc_int_t *p_libvlc)
+msg_bank_t *msg_Create (void)
 {
-    libvlc_priv_t *priv = libvlc_priv (p_libvlc);
-    msg_bank_t *bank = libvlc_bank (p_libvlc);
+    msg_bank_t *bank = malloc (sizeof (*bank));
 
     vlc_rwlock_init (&bank->lock);
-    vlc_dictionary_init( &priv->msg_enabled_objects, 0 );
-    priv->msg_all_objects_enabled = true;
+    vlc_dictionary_init (&bank->enabled_objects, 0);
+    bank->all_objects_enabled = true;
 
-    QUEUE.i_sub = 0;
-    QUEUE.pp_sub = NULL;
+    bank->i_sub = 0;
+    bank->pp_sub = NULL;
 
     /* C locale to get error messages in English in the logs */
     bank->locale = newlocale (LC_MESSAGES_MASK, "C", (locale_t)0);
@@ -124,6 +145,7 @@ void msg_Create (libvlc_int_t *p_libvlc)
     if( banks++ == 0 )
         vlc_threadvar_create( &msg_context, cleanup_msg_context );
     vlc_mutex_unlock( &msg_stack_lock );
+    return bank;
 }
 
 /**
@@ -132,26 +154,32 @@ void msg_Create (libvlc_int_t *p_libvlc)
 static void const * kObjectPrintingEnabled = &kObjectPrintingEnabled;
 static void const * kObjectPrintingDisabled = &kObjectPrintingDisabled;
 
-void __msg_EnableObjectPrinting (vlc_object_t *p_this, const char * psz_object)
+#undef msg_EnableObjectPrinting
+void msg_EnableObjectPrinting (vlc_object_t *obj, const char * psz_object)
 {
-    libvlc_priv_t *priv = libvlc_priv (p_this->p_libvlc);
-    vlc_rwlock_wrlock( &QUEUE.lock );
+    msg_bank_t *bank = libvlc_bank (obj->p_libvlc);
+
+    vlc_rwlock_wrlock (&bank->lock);
     if( !strcmp(psz_object, "all") )
-        priv->msg_all_objects_enabled = true;
+        bank->all_objects_enabled = true;
     else
-        vlc_dictionary_insert( &priv->msg_enabled_objects, psz_object, (void *)kObjectPrintingEnabled );
-    vlc_rwlock_unlock( &QUEUE.lock );
+        vlc_dictionary_insert (&bank->enabled_objects, psz_object,
+                               (void *)kObjectPrintingEnabled);
+    vlc_rwlock_unlock (&bank->lock);
 }
 
-void __msg_DisableObjectPrinting (vlc_object_t *p_this, const char * psz_object)
+#undef msg_DisableObjectPrinting
+void msg_DisableObjectPrinting (vlc_object_t *obj, const char * psz_object)
 {
-    libvlc_priv_t *priv = libvlc_priv (p_this->p_libvlc);
-    vlc_rwlock_wrlock( &QUEUE.lock );
+    msg_bank_t *bank = libvlc_bank (obj->p_libvlc);
+
+    vlc_rwlock_wrlock (&bank->lock);
     if( !strcmp(psz_object, "all") )
-        priv->msg_all_objects_enabled = false;
+        bank->all_objects_enabled = false;
     else
-        vlc_dictionary_insert( &priv->msg_enabled_objects, psz_object, (void *)kObjectPrintingDisabled );
-    vlc_rwlock_unlock( &QUEUE.lock );
+        vlc_dictionary_insert (&bank->enabled_objects, psz_object,
+                               (void *)kObjectPrintingDisabled);
+    vlc_rwlock_unlock (&bank->lock);
 }
 
 /**
@@ -161,13 +189,10 @@ void __msg_DisableObjectPrinting (vlc_object_t *p_this, const char * psz_object)
  * then frees all the allocated resources
  * No other messages interface functions should be called after this one.
  */
-void msg_Destroy (libvlc_int_t *p_libvlc)
+void msg_Destroy (msg_bank_t *bank)
 {
-    libvlc_priv_t *priv = libvlc_priv (p_libvlc);
-    msg_bank_t *bank = libvlc_bank (p_libvlc);
-
-    if( QUEUE.i_sub )
-        msg_Err( p_libvlc, "stale interface subscribers (VLC might crash)" );
+    if (unlikely(bank->i_sub != 0))
+        fputs ("stale interface subscribers (LibVLC might crash)\n", stderr);
 
     vlc_mutex_lock( &msg_stack_lock );
     assert(banks > 0);
@@ -181,9 +206,10 @@ void msg_Destroy (libvlc_int_t *p_libvlc)
     if (bank->locale != (locale_t)0)
        freelocale (bank->locale);
 
-    vlc_dictionary_clear( &priv->msg_enabled_objects, NULL, NULL );
+    vlc_dictionary_clear (&bank->enabled_objects, NULL, NULL);
 
     vlc_rwlock_destroy (&bank->lock);
+    free (bank);
 }
 
 struct msg_subscription_t
@@ -281,19 +307,19 @@ static void msg_Free (gc_object_t *gc)
 static void QueueMsg( vlc_object_t *p_this, int i_type, const char *psz_module,
                       const char *psz_format, va_list _args )
 {
-    assert (p_this);
-    libvlc_priv_t *priv = libvlc_priv (p_this->p_libvlc);
-    int         i_header_size;             /* Size of the additionnal header */
+    size_t      i_header_size;             /* Size of the additionnal header */
     vlc_object_t *p_obj;
     char *       psz_str = NULL;                 /* formatted message string */
     char *       psz_header = NULL;
     va_list      args;
 
+    assert (p_this);
+
     if( p_this->i_flags & OBJECT_FLAGS_QUIET ||
         (p_this->i_flags & OBJECT_FLAGS_NODBG && i_type == VLC_MSG_DBG) )
         return;
 
-    msg_bank_t *bank = &QUEUE;
+    msg_bank_t *bank = libvlc_bank (p_this->p_libvlc);
     locale_t locale = uselocale (bank->locale);
 
 #ifndef __GLIBC__
@@ -462,6 +488,7 @@ static void PrintMsg ( vlc_object_t * p_this, msg_item_t * p_item )
     static const char ppsz_color[4][8] = { WHITE, RED, YELLOW, GRAY };
     const char *psz_object;
     libvlc_priv_t *priv = libvlc_priv (p_this->p_libvlc);
+    msg_bank_t *bank = priv->msg_bank;
     int i_type = p_item->i_type;
 
     switch( i_type )
@@ -481,21 +508,21 @@ static void PrintMsg ( vlc_object_t * p_this, msg_item_t * p_item )
     }
 
     psz_object = p_item->psz_object_type;
-    void * val = vlc_dictionary_value_for_key( &priv->msg_enabled_objects,
-                                               p_item->psz_module );
+    void * val = vlc_dictionary_value_for_key (&bank->enabled_objects,
+                                               p_item->psz_module);
     if( val == kObjectPrintingDisabled )
         return;
     if( val == kObjectPrintingEnabled )
         /* Allowed */;
     else
     {
-        val = vlc_dictionary_value_for_key( &priv->msg_enabled_objects,
-                                            psz_object );
+        val = vlc_dictionary_value_for_key (&bank->enabled_objects,
+                                            psz_object);
         if( val == kObjectPrintingDisabled )
             return;
         if( val == kObjectPrintingEnabled )
             /* Allowed */;
-        else if( !priv->msg_all_objects_enabled )
+        else if( !bank->all_objects_enabled )
             return;
     }