#ifndef VLC_VARIABLES_H
#define VLC_VARIABLES_H 1
+#include <assert.h>
+
/**
* \file
* This file defines functions and structures for dynamic variables in vlc
* Variable types - probably very incomplete
*****************************************************************************/
#define VLC_VAR_TYPE 0x00ff
+#define VLC_VAR_CLASS 0x00f0
#define VLC_VAR_FLAGS 0xff00
/** \defgroup var_flags Additive flags
VLC_EXPORT( int, __var_Change, ( vlc_object_t *, const char *, int, vlc_value_t *, vlc_value_t * ) );
-VLC_EXPORT( int, __var_Type, ( vlc_object_t *, const char * ) );
+VLC_EXPORT( int, __var_Type, ( vlc_object_t *, const char * ) LIBVLC_USED );
VLC_EXPORT( int, __var_Set, ( vlc_object_t *, const char *, vlc_value_t ) );
VLC_EXPORT( int, __var_Get, ( vlc_object_t *, const char *, vlc_value_t * ) );
#define var_Command(a,b,c,d,e) __var_Command( VLC_OBJECT( a ), b, c, d, e )
VLC_EXPORT( int, __var_Command, ( vlc_object_t *, const char *, const char *, const char *, char ** ) );
-VLC_EXPORT( vlc_mutex_t *, var_AcquireMutex, ( const char * ) );
+VLC_EXPORT( vlc_mutex_t *, var_AcquireMutex, ( const char * ) LIBVLC_USED );
+#ifdef __GNUC__
+static
+__attribute__((unused))
+__attribute__((noinline))
+__attribute__((error("variable mutex name leaks memory at run-time")))
+const char *nonconst_mutex_name( const char *str )
+{
+ return str;
+}
+
+# define check_named_mutex( m ) \
+ (__builtin_constant_p(m) ? m : nonconst_mutex_name(m))
+#else
+# define check_named_mutex( m ) (m)
+#endif
+
+#define var_AcquireMutex( n ) var_AcquireMutex(check_named_mutex(n))
/**
* __var_Create() with automatic casting.
* helpers functions
*****************************************************************************/
+/**
+ * This function assert the variable is of the expected type or it
+ * is not defined
+ */
+static inline void __var_AssertType( vlc_object_t *p_obj, const char *psz_name,
+ int i_expected )
+{
+ const int i_type = __var_Type( p_obj, psz_name ) & VLC_VAR_CLASS;
+ assert( i_type == 0 || i_type == (i_expected&VLC_VAR_CLASS) );
+}
+
/**
* Set the value of an integer variable
*
{
vlc_value_t val;
val.i_int = i;
+ __var_AssertType( p_obj, psz_name, VLC_VAR_INTEGER );
return __var_Set( p_obj, psz_name, val );
}
#define var_SetInteger(a,b,c) __var_SetInteger( VLC_OBJECT(a),b,c)
{
vlc_value_t val;
val.b_bool = b;
+ __var_AssertType( p_obj, psz_name, VLC_VAR_BOOL );
return __var_Set( p_obj, psz_name, val );
}
{
vlc_value_t val;
val.i_time = i;
+ __var_AssertType( p_obj, psz_name, VLC_VAR_TIME );
return __var_Set( p_obj, psz_name, val );
}
{
vlc_value_t val;
val.f_float = f;
+ __var_AssertType( p_obj, psz_name, VLC_VAR_FLOAT );
return __var_Set( p_obj, psz_name, val );
}
{
vlc_value_t val;
val.psz_string = (char *)psz_string;
+ __var_AssertType( p_obj, psz_name, VLC_VAR_STRING );
return __var_Set( p_obj, psz_name, val );
}
{
vlc_value_t val;
val.b_bool = true;
+ __var_AssertType( p_obj, psz_name, VLC_VAR_VOID );
return __var_Set( p_obj, psz_name, val );
}
#define var_SetVoid(a,b) __var_SetVoid( VLC_OBJECT(a),b)
* \param p_obj The object that holds the variable
* \param psz_name The name of the variable
*/
+LIBVLC_USED
static inline int __var_GetInteger( vlc_object_t *p_obj, const char *psz_name )
{
vlc_value_t val;val.i_int = 0;
+ __var_AssertType( p_obj, psz_name, VLC_VAR_INTEGER );
if( !__var_Get( p_obj, psz_name, &val ) )
return val.i_int;
else
* \param p_obj The object that holds the variable
* \param psz_name The name of the variable
*/
+LIBVLC_USED
static inline int __var_GetBool( vlc_object_t *p_obj, const char *psz_name )
{
vlc_value_t val; val.b_bool = false;
+
+ __var_AssertType( p_obj, psz_name, VLC_VAR_BOOL );
if( !__var_Get( p_obj, psz_name, &val ) )
return val.b_bool;
else
* \param p_obj The object that holds the variable
* \param psz_name The name of the variable
*/
+LIBVLC_USED
static inline int64_t __var_GetTime( vlc_object_t *p_obj, const char *psz_name )
{
vlc_value_t val; val.i_time = 0L;
+ __var_AssertType( p_obj, psz_name, VLC_VAR_TIME );
if( !__var_Get( p_obj, psz_name, &val ) )
return val.i_time;
else
* \param p_obj The object that holds the variable
* \param psz_name The name of the variable
*/
+LIBVLC_USED
static inline float __var_GetFloat( vlc_object_t *p_obj, const char *psz_name )
{
vlc_value_t val; val.f_float = 0.0;
+ __var_AssertType( p_obj, psz_name, VLC_VAR_FLOAT );
if( !__var_Get( p_obj, psz_name, &val ) )
return val.f_float;
else
* \param p_obj The object that holds the variable
* \param psz_name The name of the variable
*/
+LIBVLC_USED
static inline char *__var_GetString( vlc_object_t *p_obj, const char *psz_name )
{
vlc_value_t val; val.psz_string = NULL;
+ __var_AssertType( p_obj, psz_name, VLC_VAR_STRING );
if( __var_Get( p_obj, psz_name, &val ) )
return NULL;
else
return val.psz_string;
}
-static inline char *__var_GetNonEmptyString( vlc_object_t *obj, const char *name )
+LIBVLC_USED
+static inline char *__var_GetNonEmptyString( vlc_object_t *p_obj, const char *psz_name )
{
vlc_value_t val;
- if( __var_Get( obj, name, &val ) )
+ __var_AssertType( p_obj, psz_name, VLC_VAR_STRING );
+ if( __var_Get( p_obj, psz_name, &val ) )
return NULL;
if( *val.psz_string )
return val.psz_string;
* \param p_obj The object that holds the variable
* \param psz_name The name of the variable
*/
+LIBVLC_USED
static inline int __var_CreateGetInteger( vlc_object_t *p_obj, const char *psz_name )
{
__var_Create( p_obj, psz_name, VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
* \param p_obj The object that holds the variable
* \param psz_name The name of the variable
*/
+LIBVLC_USED
static inline int __var_CreateGetBool( vlc_object_t *p_obj, const char *psz_name )
{
__var_Create( p_obj, psz_name, VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
* \param p_obj The object that holds the variable
* \param psz_name The name of the variable
*/
+LIBVLC_USED
static inline int64_t __var_CreateGetTime( vlc_object_t *p_obj, const char *psz_name )
{
__var_Create( p_obj, psz_name, VLC_VAR_TIME | VLC_VAR_DOINHERIT );
* \param p_obj The object that holds the variable
* \param psz_name The name of the variable
*/
+LIBVLC_USED
static inline float __var_CreateGetFloat( vlc_object_t *p_obj, const char *psz_name )
{
__var_Create( p_obj, psz_name, VLC_VAR_FLOAT | VLC_VAR_DOINHERIT );
* \param p_obj The object that holds the variable
* \param psz_name The name of the variable
*/
+LIBVLC_USED
static inline char *__var_CreateGetString( vlc_object_t *p_obj,
const char *psz_name )
{
return __var_GetString( p_obj, psz_name );
}
+LIBVLC_USED
static inline char *__var_CreateGetNonEmptyString( vlc_object_t *p_obj,
const char *psz_name )
{
* \param p_obj The object that holds the variable
* \param psz_name The name of the variable
*/
+LIBVLC_USED
static inline int __var_CreateGetIntegerCommand( vlc_object_t *p_obj, const char *psz_name )
{
__var_Create( p_obj, psz_name, VLC_VAR_INTEGER | VLC_VAR_DOINHERIT
* \param p_obj The object that holds the variable
* \param psz_name The name of the variable
*/
+LIBVLC_USED
static inline int __var_CreateGetBoolCommand( vlc_object_t *p_obj, const char *psz_name )
{
__var_Create( p_obj, psz_name, VLC_VAR_BOOL | VLC_VAR_DOINHERIT
* \param p_obj The object that holds the variable
* \param psz_name The name of the variable
*/
+LIBVLC_USED
static inline int64_t __var_CreateGetTimeCommand( vlc_object_t *p_obj, const char *psz_name )
{
__var_Create( p_obj, psz_name, VLC_VAR_TIME | VLC_VAR_DOINHERIT
* \param p_obj The object that holds the variable
* \param psz_name The name of the variable
*/
+LIBVLC_USED
static inline float __var_CreateGetFloatCommand( vlc_object_t *p_obj, const char *psz_name )
{
__var_Create( p_obj, psz_name, VLC_VAR_FLOAT | VLC_VAR_DOINHERIT
* \param p_obj The object that holds the variable
* \param psz_name The name of the variable
*/
+LIBVLC_USED
static inline char *__var_CreateGetStringCommand( vlc_object_t *p_obj,
const char *psz_name )
{
return __var_GetString( p_obj, psz_name );
}
+LIBVLC_USED
static inline char *__var_CreateGetNonEmptyStringCommand( vlc_object_t *p_obj,
const char *psz_name )
{