diff options
author | Lennart Poettering <lennart@poettering.net> | 2007-06-13 22:08:14 +0000 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2007-06-13 22:08:14 +0000 |
commit | be4a8828360b3607414c3ebfd836494e6490267d (patch) | |
tree | 765c44df62326769c1356483f79f5d300ddab9b3 /src/pulsecore/object.h | |
parent | 69115687ad1604ddfa9fa7cd86eb286e6bb5ea9a (diff) |
A lot of more work to get the lock-free stuff in place
git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/lennart@1474 fefdeb5f-60dc-0310-8127-8f9354f1896f
Diffstat (limited to 'src/pulsecore/object.h')
-rw-r--r-- | src/pulsecore/object.h | 72 |
1 files changed, 55 insertions, 17 deletions
diff --git a/src/pulsecore/object.h b/src/pulsecore/object.h index e195a359..270f289d 100644 --- a/src/pulsecore/object.h +++ b/src/pulsecore/object.h @@ -25,7 +25,9 @@ USA. ***/ +#include <string.h> #include <sys/types.h> + #include <pulse/xmalloc.h> #include <pulsecore/refcnt.h> #include <pulsecore/macro.h> @@ -36,13 +38,22 @@ struct pa_object { PA_REFCNT_DECLARE; const char *type_name; void (*free)(pa_object *o); + int (*check_type)(pa_object *o, const char *type_name); }; -pa_object *pa_object_new_internal(size_t size, const char *type_name); -#define pa_object_new(type) ((type*) pa_object_new_internal(sizeof(type), #type)) +pa_object *pa_object_new_internal(size_t size, const char *type_name, int (*check_type)(pa_object *o, const char *type_name)); +#define pa_object_new(type, check_type) ((type*) pa_object_new_internal(sizeof(type), #type, check_type) #define pa_object_free ((void (*) (pa_object* o)) pa_xfree) +int pa_object_check_type(pa_object *o, const char *type); + +static inline int pa_object_isinstance(void *o) { + pa_object *obj = (pa_object*) o; + pa_assert(obj); + return obj->check_type(obj, "pa_object"); +} + pa_object *pa_object_ref(pa_object *o); void pa_object_unref(pa_object *o); @@ -50,23 +61,50 @@ static inline int pa_object_refcnt(pa_object *o) { return o ? PA_REFCNT_VALUE(o) : 0; } +static inline pa_object* pa_object_cast(void *o) { + pa_object *obj = (pa_object*) o; + pa_assert(obj->check_type(obj, "pa_object")); + return obj; +} + #define pa_object_assert_ref(o) pa_assert(pa_object_refcnt(o)) -#define PA_OBJECT(o) ((pa_object*) (o)) - -#define PA_DECLARE_CLASS(c) \ - static inline c* c##_ref(c *o) { \ - return (c*) pa_object_ref(PA_OBJECT(o)); \ - } \ - static inline void c##_unref(c* o) { \ - pa_object_unref(PA_OBJECT(o)); \ - } \ - static inline int c##_refcnt(c* o) { \ - return pa_object_refcnt(PA_OBJECT(o)); \ - } \ - static inline void c##_assert_ref(c *o) { \ - pa_object_assert_ref(PA_OBJECT(o)); \ - } \ +#define PA_OBJECT(o) pa_object_cast(o) + +#define PA_DECLARE_CLASS(c) \ + static inline int c##_isinstance(void *o) { \ + pa_object *obj = (pa_object*) o; \ + pa_assert(obj); \ + return obj->check_type(obj, #c); \ + } \ + static inline c* c##_cast(void *o) { \ + pa_assert(c##_isinstance(o)); \ + return (c*) o; \ + } \ + static inline c* c##_ref(c *o) { \ + return (c*) pa_object_ref(PA_OBJECT(o)); \ + } \ + static inline void c##_unref(c* o) { \ + pa_object_unref(PA_OBJECT(o)); \ + } \ + static inline int c##_refcnt(c* o) { \ + return pa_object_refcnt(PA_OBJECT(o)); \ + } \ + static inline void c##_assert_ref(c *o) { \ + pa_object_assert_ref(PA_OBJECT(o)); \ + } \ + struct __stupid_useless_struct_to_allow_trailing_semicolon + +#define PA_DEFINE_CHECK_TYPE(c, func, parent) \ + int func(pa_object *o, const char *type) { \ + pa_assert(o); \ + pa_assert(type); \ + if (type == #c || \ + strcmp(type, #c) == 0) \ + return 1; \ + return parent(o, type); \ + } \ struct __stupid_useless_struct_to_allow_trailing_semicolon + #endif |