From 7fe60435bce6595a9c58a9bfd8244d74b5320e96 Mon Sep 17 00:00:00 2001 From: Benjamin Franzke Date: Tue, 15 Jan 2013 08:46:13 +0100 Subject: Import DirectFB141_2k11R3_beta5 --- Source/DirectFB/lib/fusion/object.h | 279 ++++++++++++++++++++++++++++++++++++ 1 file changed, 279 insertions(+) create mode 100755 Source/DirectFB/lib/fusion/object.h (limited to 'Source/DirectFB/lib/fusion/object.h') diff --git a/Source/DirectFB/lib/fusion/object.h b/Source/DirectFB/lib/fusion/object.h new file mode 100755 index 0000000..ae75374 --- /dev/null +++ b/Source/DirectFB/lib/fusion/object.h @@ -0,0 +1,279 @@ +/* + (c) Copyright 2001-2009 The world wide DirectFB Open Source Community (directfb.org) + (c) Copyright 2000-2004 Convergence (integrated media) GmbH + + All rights reserved. + + Written by Denis Oliver Kropp , + Andreas Hundt , + Sven Neumann , + Ville Syrjälä and + Claudio Ciccani . + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#ifndef __FUSION__OBJECT_H__ +#define __FUSION__OBJECT_H__ + +#include + +#include +#include +#include +#include +#include + +typedef void (*FusionObjectDestructor)( FusionObject *object, bool zombie, void *ctx ); + +typedef bool (*FusionPropIterator)( char *key, void *value, void *ctx); + + + + +typedef unsigned long FusionObjectID; + + +typedef enum { + FOS_INIT, + FOS_ACTIVE, + FOS_DEINIT +} FusionObjectState; + +struct __Fusion_FusionObject { + DirectLink link; + FusionObjectPool *pool; + + int magic; + + FusionObjectID id; + + FusionObjectState state; + + FusionRef ref; + FusionReactor *reactor; + + FusionWorldShared *shared; + FusionHash *properties; +}; + + +typedef bool (*FusionObjectCallback)( FusionObjectPool *pool, + FusionObject *object, + void *ctx ); + + +FusionObjectPool *fusion_object_pool_create ( const char *name, + int object_size, + int message_size, + FusionObjectDestructor destructor, + void *ctx, + const FusionWorld *world ); + +DirectResult fusion_object_pool_destroy( FusionObjectPool *pool, + const FusionWorld *world ); + + +DirectResult fusion_object_pool_enum ( FusionObjectPool *pool, + FusionObjectCallback callback, + void *ctx ); + + +FusionObject *fusion_object_create ( FusionObjectPool *pool, + const FusionWorld *world ); + +DirectResult fusion_object_get ( FusionObjectPool *pool, + FusionObjectID object_id, + FusionObject **ret_object ); + +DirectResult fusion_object_set_lock( FusionObject *object, + FusionSkirmish *lock ); + +DirectResult fusion_object_activate( FusionObject *object ); + +DirectResult fusion_object_destroy ( FusionObject *object ); + +DirectResult fusion_object_set_property( FusionObject *object , + const char *key, void *value, void **old_value); + +DirectResult fusion_object_set_int_property( FusionObject *object , + const char *key,int value); + +DirectResult fusion_object_set_string_property( FusionObject *object , + const char *key,char *value); + +void *fusion_object_get_property( FusionObject *object ,const char *key); +void fusion_object_remove_property( FusionObject *object ,const char *key,void **ret_val); + +#define FUSION_OBJECT_METHODS(type, prefix) \ + \ +static inline DirectResult \ +prefix##_attach( type *object, \ + ReactionFunc func, \ + void *ctx, \ + Reaction *ret_reaction ) \ +{ \ + D_MAGIC_ASSERT( (FusionObject*) object, FusionObject ); \ + return fusion_reactor_attach( ((FusionObject*)object)->reactor, \ + func, ctx, ret_reaction ); \ +} \ + \ +static inline DirectResult \ +prefix##_attach_channel( type *object, \ + int channel, \ + ReactionFunc func, \ + void *ctx, \ + Reaction *ret_reaction ) \ +{ \ + D_MAGIC_ASSERT( (FusionObject*) object, FusionObject ); \ + return fusion_reactor_attach_channel( ((FusionObject*)object)->reactor, \ + channel, func, ctx, ret_reaction ); \ +} \ + \ +static inline DirectResult \ +prefix##_detach( type *object, \ + Reaction *reaction ) \ +{ \ + D_MAGIC_ASSERT( (FusionObject*) object, FusionObject ); \ + return fusion_reactor_detach( ((FusionObject*)object)->reactor, \ + reaction ); \ +} \ + \ +static inline DirectResult \ +prefix##_attach_global( type *object, \ + int index, \ + void *ctx, \ + GlobalReaction *reaction ) \ +{ \ + D_MAGIC_ASSERT( (FusionObject*) object, FusionObject ); \ + return fusion_reactor_attach_global( ((FusionObject*)object)->reactor, \ + index, ctx, reaction ); \ +} \ + \ +static inline DirectResult \ +prefix##_detach_global( type *object, \ + GlobalReaction *reaction ) \ +{ \ + D_MAGIC_ASSERT( (FusionObject*) object, FusionObject ); \ + return fusion_reactor_detach_global( ((FusionObject*)object)->reactor, \ + reaction ); \ +} \ + \ +static inline DirectResult \ +prefix##_dispatch( type *object, \ + void *message, \ + const ReactionFunc *globals ) \ +{ \ + D_MAGIC_ASSERT( (FusionObject*) object, FusionObject ); \ + return fusion_reactor_dispatch( ((FusionObject*)object)->reactor, \ + message, true, globals ); \ +} \ + \ +static inline DirectResult \ +prefix##_dispatch_channel( type *object, \ + int channel, \ + void *message, \ + int size, \ + const ReactionFunc *globals ) \ +{ \ + D_MAGIC_ASSERT( (FusionObject*) object, FusionObject ); \ + return fusion_reactor_dispatch_channel( ((FusionObject*)object)->reactor, \ + channel, message, size, true, globals ); \ +} \ + \ +static inline DirectResult \ +prefix##_ref( type *object ) \ +{ \ + D_MAGIC_ASSERT( (FusionObject*) object, FusionObject ); \ + return fusion_ref_up( &((FusionObject*)object)->ref, false ); \ +} \ + \ +static inline DirectResult \ +prefix##_unref( type *object ) \ +{ \ + D_MAGIC_ASSERT( (FusionObject*) object, FusionObject ); \ + return fusion_ref_down( &((FusionObject*)object)->ref, false ); \ +} \ + \ +static inline DirectResult \ +prefix##_ref_stat( type *object, int *refs ) \ +{ \ + D_MAGIC_ASSERT( (FusionObject*) object, FusionObject ); \ + return fusion_ref_stat ( &((FusionObject*)object)->ref, refs ); \ +} \ + \ +static inline DirectResult \ +prefix##_link( type **link, \ + type *object ) \ +{ \ + DirectResult ret; \ + \ + D_MAGIC_ASSERT( (FusionObject*) object, FusionObject ); \ + \ + ret = fusion_ref_up( &((FusionObject*)object)->ref, true ); \ + if (ret) \ + return ret; \ + \ + *link = object; \ + \ + return DR_OK; \ +} \ + \ +static inline DirectResult \ +prefix##_unlink( type **link ) \ +{ \ + type *object = *link; \ + \ + D_MAGIC_ASSERT( (FusionObject*) object, FusionObject ); \ + \ + *link = NULL; \ + \ + return fusion_ref_down( &((FusionObject*)object)->ref, true ); \ +} \ + \ +static inline DirectResult \ +prefix##_inherit( type *object, \ + void *from ) \ +{ \ + D_MAGIC_ASSERT( (FusionObject*) object, FusionObject ); \ + D_MAGIC_ASSERT( (FusionObject*) from, FusionObject ); \ + \ + return fusion_ref_inherit( &((FusionObject*)object)->ref, \ + &((FusionObject*)from)->ref ); \ +} \ + \ +static inline DirectResult \ +prefix##_globalize( type *object ) \ +{ \ + DirectResult ret; \ + \ + D_MAGIC_ASSERT( (FusionObject*) object, FusionObject ); \ + \ + ret = fusion_ref_up( &((FusionObject*)object)->ref, true ); \ + if (ret) \ + return ret; \ + \ + ret = fusion_ref_down( &((FusionObject*)object)->ref, false ); \ + if (ret) \ + fusion_ref_down( &((FusionObject*)object)->ref, true ); \ + \ + return ret; \ +} + +FUSION_OBJECT_METHODS( void, fusion_object ) + +#endif + -- cgit