#include <string.h>
#include <stdio.h>
#include <inttypes.h>
+#include <stddef.h>
#ifndef __cplusplus
# include <stdbool.h>
typedef struct vlc_list_t vlc_list_t;
typedef struct vlc_object_t vlc_object_t;
typedef struct libvlc_int_t libvlc_int_t;
-typedef struct variable_t variable_t;
typedef struct date_t date_t;
typedef struct dict_entry_t dict_entry_t;
typedef struct dict_t dict_t;
-typedef struct gc_object_t gc_object_t ;
-
-/* Messages */
-typedef struct msg_subscription_t msg_subscription_t;
/* Playlist */
/* stat/lstat/fstat */
#ifdef WIN32
-# ifdef UNDER_CE
-# undef _STAT_DEFINED
-# endif
#include <sys/stat.h>
+
# ifndef UNDER_CE
struct _stati64;
#define stat _stati64
#define fstat _fstati64
-# else
-# define stat _stat
-# define fstat _fstat
-# endif
+#endif
+
/* You should otherwise use utf8_stat and utf8_lstat. */
#else
struct stat;
#if defined( WIN32 ) || defined( UNDER_CE )
# define WIN32_LEAN_AND_MEAN
# include <windows.h>
-# if defined( UNDER_CE )
-# define IS_WINNT 0
-# else
-# define IS_WINNT ( GetVersion() < 0x80000000 )
-# endif
#endif
#include "vlc_mtime.h"
* these members are common for all vlc objects \
*/ \
/**@{*/ \
- int i_object_id; \
int i_object_type; \
const char *psz_object_type; \
char *psz_object_name; \
/* Object properties */ \
volatile bool b_error; /**< set by the object */ \
volatile bool b_die; /**< set by the outside */ \
- bool b_force; /**< set by the outside (eg. module_Need()) */ \
+ bool b_force; /**< set by the outside (eg. module_need()) */ \
+ \
+ /** Just a reminder so that people don't cast garbage */ \
+ bool be_sure_to_add_VLC_COMMON_MEMBERS_to_struct; \
\
/* Stuff related to the libvlc structure */ \
libvlc_int_t *p_libvlc; /**< (root of all evil) - 1 */ \
/* Private data */ \
void * p_private; \
\
- /** Just a reminder so that people don't cast garbage */ \
- int be_sure_to_add_VLC_COMMON_MEMBERS_to_struct; \
/**@}*/ \
/* VLC_OBJECT: attempt at doing a clever cast */
# define VLC_OBJECT( x ) ((vlc_object_t *)(x))
#endif
-#define VLC_GC_MEMBERS \
-/** \name VLC_GC_MEMBERS \
- * these members are common to all objects that wish to be garbage-collected \
- */ \
-/**@{*/ \
- int i_gc_refcount; \
- void (*pf_destructor) ( gc_object_t * ); \
- void *p_destructor_arg; \
-/**@}*/
-
-struct gc_object_t
+typedef struct gc_object_t
{
- VLC_GC_MEMBERS
-};
+ vlc_spinlock_t spin;
+ uintptr_t refs;
+ void (*pf_destructor) (struct gc_object_t *);
+} gc_object_t;
-VLC_EXPORT(void, __vlc_gc_incref, ( gc_object_t * p_gc ));
-VLC_EXPORT(void, __vlc_gc_decref, ( gc_object_t * p_gc ));
-VLC_EXPORT(void, __vlc_gc_init, ( gc_object_t * p_gc,
- void (*pf_destructor)( gc_object_t * ), void * arg));
+/**
+ * These members are common to all objects that wish to be garbage-collected.
+ */
+#define VLC_GC_MEMBERS gc_object_t vlc_gc_data;
-#define vlc_gc_incref( a ) __vlc_gc_incref( (gc_object_t *)a )
-#define vlc_gc_decref( a ) __vlc_gc_decref( (gc_object_t *)a )
-#define vlc_gc_init( a,b,c ) __vlc_gc_init( (gc_object_t *)a,b,c )
+VLC_EXPORT(void *, vlc_gc_init, (gc_object_t *, void (*)(gc_object_t *)));
+VLC_EXPORT(void *, vlc_hold, (gc_object_t *));
+VLC_EXPORT(void, vlc_release, (gc_object_t *));
+#define vlc_gc_init( a,b ) vlc_gc_init( &(a)->vlc_gc_data, (b) )
+#define vlc_gc_incref( a ) vlc_hold( &(a)->vlc_gc_data )
+#define vlc_gc_decref( a ) vlc_release( &(a)->vlc_gc_data )
+#define vlc_priv( gc, t ) ((t *)(((char *)(gc)) - offsetof(t, vlc_gc_data)))
/*****************************************************************************
* Macros and inline functions