2005-02-07 05:51:09 -08:00
|
|
|
/*
|
|
|
|
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
|
|
|
|
*/
|
2005-01-12 08:03:09 -08:00
|
|
|
#ifdef E_TYPEDEFS
|
2005-01-12 22:08:07 -08:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
/* Object safety/debugging checks */
|
|
|
|
/* */
|
|
|
|
/* OBJECT_PARANOIA_CHECK is paranoid and checkes pointers and traps segv's */
|
2006-05-31 23:44:37 -07:00
|
|
|
/* in case they dont work... very paranoid and slow. NB for backtrace to */
|
2004-11-24 19:37:45 -08:00
|
|
|
/* work you need gcc, glibc and you need to compile with compile options of */
|
|
|
|
/* -g -rdynamic and link with them too */
|
|
|
|
/* OBJECT_CHECK is a simple null pointer and magic number check with no */
|
|
|
|
/* debug output */
|
|
|
|
|
|
|
|
#ifndef __GLIBC__
|
|
|
|
# ifdef OBJECT_PARANOIA_CHECK
|
|
|
|
# warning "Your system doesn't have glibc. Paranoid object checking disabled."
|
|
|
|
# undef OBJECT_PARANOIA_CHECK
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define E_OBJECT_MAGIC 0xe0b9ec75
|
|
|
|
#define E_OBJECT_MAGIC_FREED 0xe0bf6eed
|
|
|
|
#define E_OBJECT(x) ((E_Object *)(x))
|
|
|
|
#define E_OBJECT_CLEANUP_FUNC(x) ((E_Object_Cleanup_Func)(x))
|
2005-01-21 22:58:34 -08:00
|
|
|
#define E_OBJECT_ALLOC(x, type, cleanup_func) e_object_alloc(sizeof(x), (type), E_OBJECT_CLEANUP_FUNC(cleanup_func))
|
2004-11-24 19:37:45 -08:00
|
|
|
#define E_OBJECT_DEL_SET(x, del_func) e_object_del_func_set(E_OBJECT(x), E_OBJECT_CLEANUP_FUNC(del_func))
|
|
|
|
|
|
|
|
#ifdef OBJECT_PARANOIA_CHECK
|
2005-12-27 09:16:58 -08:00
|
|
|
# define E_OBJECT_CHECK(x) do {if (e_object_error(E_OBJECT(x))) return;} while (0)
|
|
|
|
# define E_OBJECT_CHECK_RETURN(x, ret) do {if (e_object_error(E_OBJECT(x))) return ret;} while (0)
|
|
|
|
# define E_OBJECT_TYPE_CHECK(x, tp) do {if ((E_OBJECT(x)->type) != (tp)) { fprintf(stderr, "Object type check failed in %s\n", __FUNCTION__); return;} } while (0)
|
|
|
|
# define E_OBJECT_TYPE_CHECK_RETURN(x, tp, ret) do {if ((E_OBJECT(x)->type) != tp) { fprintf(stderr, "Object type check failed in %s\n", __FUNCTION__); return ret;} } while (0)
|
|
|
|
# define E_OBJECT_IF_NOT_TYPE(x, tp) if (E_OBJECT(x)->type != (tp))
|
2004-11-24 19:37:45 -08:00
|
|
|
#else
|
|
|
|
# ifdef OBJECT_CHECK
|
2005-12-27 09:16:58 -08:00
|
|
|
# define E_OBJECT_CHECK(x) do {if ((!E_OBJECT(x)) || (E_OBJECT(x)->magic != E_OBJECT_MAGIC)) return;} while (0)
|
|
|
|
# define E_OBJECT_CHECK_RETURN(x, ret) do {if ((!E_OBJECT(x)) || (E_OBJECT(x)->magic != E_OBJECT_MAGIC)) return ret;} while (0)
|
|
|
|
# define E_OBJECT_TYPE_CHECK(x, tp) do {if ((E_OBJECT(x)->type) != (tp)) { fprintf(stderr, "Object type check failed in %s\n", __FUNCTION__); return;} } while (0)
|
2005-01-21 22:58:34 -08:00
|
|
|
# define E_OBJECT_TYPE_CHECK_RETURN(x, tp, ret) do {if ((E_OBJECT(x)->type) != (tp)) { fprintf(stderr, "Object type check failed in %s\n", __FUNCTION__); return ret;} } while (0)
|
2005-12-27 09:16:58 -08:00
|
|
|
# define E_OBJECT_IF_NOT_TYPE(x, type) if (E_OBJECT(x)->type != (type))
|
2004-11-24 19:37:45 -08:00
|
|
|
# else
|
|
|
|
# define E_OBJECT_CHECK(x)
|
|
|
|
# define E_OBJECT_CHECK_RETURN(x, ret)
|
2005-01-21 22:58:34 -08:00
|
|
|
# define E_OBJECT_TYPE_CHECK(x, type)
|
|
|
|
# define E_OBJECT_TYPE_CHECK_RETURN(x, type, ret)
|
2005-01-12 08:03:09 -08:00
|
|
|
# define E_OBJECT_IF_NOT_TYPE(x, type)
|
2004-11-24 19:37:45 -08:00
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
typedef void (*E_Object_Cleanup_Func) (void *obj);
|
|
|
|
|
|
|
|
typedef struct _E_Object E_Object;
|
|
|
|
|
2005-01-12 08:03:09 -08:00
|
|
|
#else
|
|
|
|
#ifndef E_OBJECT_H
|
|
|
|
#define E_OBJECT_H
|
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
struct _E_Object
|
|
|
|
{
|
|
|
|
int magic;
|
2005-01-12 08:03:09 -08:00
|
|
|
int type;
|
2004-11-24 19:37:45 -08:00
|
|
|
int references;
|
|
|
|
E_Object_Cleanup_Func del_func;
|
|
|
|
E_Object_Cleanup_Func cleanup_func;
|
2005-01-12 01:22:44 -08:00
|
|
|
void (*free_att_func) (void *obj);
|
|
|
|
void (*del_att_func) (void *obj);
|
2004-11-24 19:37:45 -08:00
|
|
|
void *data;
|
|
|
|
unsigned char deleted : 1;
|
2005-07-27 21:35:45 -07:00
|
|
|
// Evas_List *crumbs;
|
2004-11-24 19:37:45 -08:00
|
|
|
};
|
|
|
|
|
2005-01-21 22:58:34 -08:00
|
|
|
EAPI void *e_object_alloc (int size, int type, E_Object_Cleanup_Func cleanup_func);
|
2004-11-24 21:31:21 -08:00
|
|
|
EAPI void e_object_del (E_Object *obj);
|
2005-05-11 06:13:43 -07:00
|
|
|
EAPI int e_object_is_del (E_Object *obj);
|
2004-11-24 21:31:21 -08:00
|
|
|
EAPI void e_object_del_func_set (E_Object *obj, E_Object_Cleanup_Func del_func);
|
2005-01-12 08:03:09 -08:00
|
|
|
EAPI void e_object_type_set (E_Object *obj, int type);
|
2004-11-24 21:31:21 -08:00
|
|
|
EAPI void e_object_free (E_Object *obj);
|
|
|
|
EAPI int e_object_ref (E_Object *obj);
|
|
|
|
EAPI int e_object_unref (E_Object *obj);
|
|
|
|
EAPI int e_object_ref_get (E_Object *obj);
|
|
|
|
EAPI int e_object_error (E_Object *obj);
|
|
|
|
EAPI void e_object_data_set (E_Object *obj, void *data);
|
|
|
|
EAPI void *e_object_data_get (E_Object *obj);
|
|
|
|
EAPI void e_object_free_attach_func_set(E_Object *obj, void (*func) (void *obj));
|
2005-01-12 01:22:44 -08:00
|
|
|
EAPI void e_object_del_attach_func_set (E_Object *obj, void (*func) (void *obj));
|
2004-11-24 19:37:45 -08:00
|
|
|
|
2005-07-27 21:35:45 -07:00
|
|
|
/*
|
2005-06-24 23:54:22 -07:00
|
|
|
EAPI void e_object_breadcrumb_add (E_Object *obj, char *crumb);
|
|
|
|
EAPI void e_object_breadcrumb_del (E_Object *obj, char *crumb);
|
|
|
|
EAPI void e_object_breadcrumb_debug (E_Object *obj);
|
2005-07-27 21:35:45 -07:00
|
|
|
*/
|
2005-06-24 23:54:22 -07:00
|
|
|
|
2004-11-24 19:37:45 -08:00
|
|
|
#endif
|
2005-01-12 08:03:09 -08:00
|
|
|
#endif
|