]> git.sesse.net Git - vlc/commitdiff
* ./modules/misc/testsuite/test4.c: made the 4th test less CPU intensive
authorSam Hocevar <sam@videolan.org>
Mon, 14 Oct 2002 19:04:51 +0000 (19:04 +0000)
committerSam Hocevar <sam@videolan.org>
Mon, 14 Oct 2002 19:04:51 +0000 (19:04 +0000)
    by making the spawned threads wait a bit longer.
  * ./src/misc/variables.c: added a usage count to the variables; trying to
    create a variable with the same name only increments its refcount.

include/variables.h
modules/misc/testsuite/test4.c
src/misc/variables.c

index c2a64a4a6297bc4bf75cef14963ec7b0af201a5a..52b398389c58d76b27e930d3771d719c498fa1c4 100644 (file)
@@ -2,7 +2,7 @@
  * variables.h: variables handling
  *****************************************************************************
  * Copyright (C) 2002 VideoLAN
- * $Id: variables.h,v 1.2 2002/10/14 16:46:55 sam Exp $
+ * $Id: variables.h,v 1.3 2002/10/14 19:04:51 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *
@@ -31,6 +31,7 @@
 #define VLC_VAR_TIME      0x0500
 #define VLC_VAR_ADDRESS   0x0600
 #define VLC_VAR_COMMAND   0x0700
+#define VLC_VAR_MUTEX     0x0800
 
 /*****************************************************************************
  * vlc_value_t is the common union for variable values; variable_t is the
@@ -45,6 +46,7 @@ struct variable_t
     vlc_value_t  val;
 
     /* Lots of other things that can be added */
+    int          i_usage;
     vlc_bool_t   b_set;
     vlc_bool_t   b_active;
 };
index 4e4e3555b7a44d371809e77c1ef6bb7fa60537d5..53d8d2ae1310b816698c6ba1f36fd9c9559df029 100644 (file)
@@ -2,7 +2,7 @@
  * test4.c : Miscellaneous stress tests module for vlc
  *****************************************************************************
  * Copyright (C) 2002 VideoLAN
- * $Id: test4.c,v 1.1 2002/10/14 16:34:17 sam Exp $
+ * $Id: test4.c,v 1.2 2002/10/14 19:04:51 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *
@@ -228,7 +228,7 @@ static void * Dummy( vlc_object_t *p_this )
 
     while( !p_this->b_die )
     {
-        msleep( 1000 );
+        msleep( 10000 );
     }
 
     for( i = MAXOBJ/MAXTH; i--; )
index 03fc83baaa162bbaa37880d87f554aed0fbc8758..1b1e4186df8c49b33e52702cd8cf89605b1ce551 100644 (file)
@@ -2,7 +2,7 @@
  * variables.c: routines for object variables handling
  *****************************************************************************
  * Copyright (C) 2002 VideoLAN
- * $Id: variables.c,v 1.2 2002/10/14 16:46:56 sam Exp $
+ * $Id: variables.c,v 1.3 2002/10/14 19:04:51 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *
@@ -49,29 +49,53 @@ static int LookupInner    ( variable_t *, int, u32 );
 int __var_Create( vlc_object_t *p_this, const char *psz_name, int i_type )
 {
     int i_new;
+    variable_t *p_var;
 
     vlc_mutex_lock( &p_this->var_lock );
 
+    /* FIXME: if the variable already exists, we don't duplicate it. But we
+     * duplicate the lookups. It's not that serious, but if anyone finds some
+     * time to rework Insert() so that only one lookup has to be done, feel
+     * free to do so. */
+    i_new = Lookup( p_this->p_vars, p_this->i_vars, psz_name );
+
+    if( i_new >= 0 )
+    {
+        /* If the types differ, variable creation failed. */
+        if( i_type != p_this->p_vars[i_new].i_type )
+        {
+            vlc_mutex_unlock( &p_this->var_lock );
+            return VLC_EBADVAR;
+        }
+
+        p_this->p_vars[i_new].i_usage++;
+        vlc_mutex_unlock( &p_this->var_lock );
+        return VLC_SUCCESS;
+    }
+
+    i_new = Insert( p_this->p_vars, p_this->i_vars, psz_name );
+
     if( (p_this->i_vars & 15) == 15 )
     {
         p_this->p_vars = realloc( p_this->p_vars,
                                   (p_this->i_vars+17) * sizeof(variable_t) );
     }
 
-    i_new = Insert( p_this->p_vars, p_this->i_vars, psz_name );
-
     memmove( p_this->p_vars + i_new + 1,
              p_this->p_vars + i_new,
              (p_this->i_vars - i_new) * sizeof(variable_t) );
 
-    p_this->p_vars[i_new].i_hash = HashString( psz_name );
-    p_this->p_vars[i_new].psz_name = strdup( psz_name );
+    p_var = &p_this->p_vars[i_new];
 
-    p_this->p_vars[i_new].i_type = i_type;
-    memset( &p_this->p_vars[i_new].val, 0, sizeof(vlc_value_t) );
+    p_var->i_hash = HashString( psz_name );
+    p_var->psz_name = strdup( psz_name );
 
-    p_this->p_vars[i_new].b_set = VLC_FALSE;
-    p_this->p_vars[i_new].b_active = VLC_TRUE;
+    p_var->i_type = i_type;
+    memset( &p_var->val, 0, sizeof(vlc_value_t) );
+
+    p_var->i_usage = 1;
+    p_var->b_set = VLC_FALSE;
+    p_var->b_active = VLC_TRUE;
 
     p_this->i_vars++;
 
@@ -89,6 +113,7 @@ int __var_Create( vlc_object_t *p_this, const char *psz_name, int i_type )
 int __var_Destroy( vlc_object_t *p_this, const char *psz_name )
 {
     int i_del;
+    variable_t *p_var;
 
     vlc_mutex_lock( &p_this->var_lock );
 
@@ -101,21 +126,29 @@ int __var_Destroy( vlc_object_t *p_this, const char *psz_name )
         return VLC_ENOVAR;
     }
 
+    p_var = &p_this->p_vars[i_del];
+
+    if( p_var->i_usage > 1 )
+    {
+        p_var->i_usage--;
+        vlc_mutex_unlock( &p_this->var_lock );
+        return VLC_SUCCESS;
+    }
+
     /* Free value if needed */
-    switch( p_this->p_vars[i_del].i_type )
+    switch( p_var->i_type )
     {
         case VLC_VAR_STRING:
         case VLC_VAR_MODULE:
         case VLC_VAR_FILE:
-            if( p_this->p_vars[i_del].b_set
-                 && p_this->p_vars[i_del].val.psz_string )
+            if( p_var->b_set && p_var->val.psz_string )
             {
-                free( p_this->p_vars[i_del].val.psz_string );
+                free( p_var->val.psz_string );
             }
             break;
     }
 
-    free( p_this->p_vars[i_del].psz_name );
+    free( p_var->psz_name );
 
     memmove( p_this->p_vars + i_del,
              p_this->p_vars + i_del + 1,