#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;
typedef struct services_discovery_t services_discovery_t;
typedef struct services_discovery_sys_t services_discovery_sys_t;
typedef struct playlist_add_t playlist_add_t;
-typedef struct playlist_preparse_t playlist_preparse_t;
-typedef struct playlist_fetcher_t playlist_fetcher_t;
/* Modules */
typedef struct module_bank_t module_bank_t;
#include "vlc_mtime.h"
#include "vlc_threads.h"
-typedef struct vlc_object_internals_t vlc_object_internals_t;
-
/*****************************************************************************
* Common structure members
*****************************************************************************/
* 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 */ \
- volatile bool b_dead; /**< set by the object */ \
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