1 #ifdef E_TYPEDEFS
2 
3 /* Object safety/debugging checks */
4 /* */
5 /* OBJECT_PARANOIA_CHECK is paranoid and checks pointers and traps segv's */
6 /* in case they dont work... very paranoid and slow. NB for backtrace to */
7 /* work you need gcc, glibc and you need to compile with compile options of */
8 /* -g -rdynamic and link with them too */
9 /* OBJECT_CHECK is a simple null pointer and magic number check with no */
10 /* debug output */
11 
12 #ifndef __GLIBC__
13 # ifdef OBJECT_PARANOIA_CHECK
14 #  warning "Your system doesn't have glibc. Paranoid object checking disabled."
15 #  undef OBJECT_PARANOIA_CHECK
16 # endif
17 #endif
18 
19 #define E_OBJECT_MAGIC                  0xe0b9ec75
20 #define E_OBJECT_MAGIC_FREED            0xe0bf6eed
21 #define E_OBJECT(x)                     ((E_Object *)(x))
22 #define E_OBJECT_CLEANUP_FUNC(x)        ((E_Object_Cleanup_Func)(x))
23 #define E_OBJECT_ALLOC(x, type, cleanup_func) e_object_alloc(sizeof(x), (type), E_OBJECT_CLEANUP_FUNC(cleanup_func))
24 #define E_OBJECT_DEL_SET(x, del_func)   e_object_del_func_set(E_OBJECT(x), E_OBJECT_CLEANUP_FUNC(del_func))
25 
26 #ifdef OBJECT_PARANOIA_CHECK
27 # define E_OBJECT_CHECK(x)                       do {if (e_object_error(E_OBJECT(x))) return;} while (0)
28 # define E_OBJECT_CHECK_RETURN(x, ret)           do {if (e_object_error(E_OBJECT(x))) return ret;} while (0)
29 #  define E_OBJECT_TYPE_CHECK(x, tp)             do {if ((E_OBJECT(x)->type) != (tp)) { CRI("Object type check failed in %s", __FUNCTION__); return;} } while (0)
30 #  define E_OBJECT_TYPE_CHECK_RETURN(x, tp, ret) do {if ((E_OBJECT(x)->type) != tp) { CRI("Object type check failed in %s", __FUNCTION__); return ret;} } while (0)
31 #  define E_OBJECT_IF_NOT_TYPE(x, tp)            if (E_OBJECT(x)->type != (tp))
32 #else
33 # ifdef OBJECT_CHECK
34 #  define E_OBJECT_CHECK(x)                       do {if ((!E_OBJECT(x)) || (E_OBJECT(x)->magic != (int)E_OBJECT_MAGIC)) return;} while (0)
35 #  define E_OBJECT_CHECK_RETURN(x, ret)           do {if ((!E_OBJECT(x)) || (E_OBJECT(x)->magic != (int)E_OBJECT_MAGIC)) return ret;} while (0)
36 #  define E_OBJECT_TYPE_CHECK(x, tp)              do {if ((E_OBJECT(x)->type) != (int)(tp)) { CRI("Object type check failed in %s", __FUNCTION__); return;} } while (0)
37 #  define E_OBJECT_TYPE_CHECK_RETURN(x, tp, ret)  do {if ((E_OBJECT(x)->type) != (int)(tp)) { CRI("Object type check failed in %s", __FUNCTION__); return ret;} } while (0)
38 #  define E_OBJECT_IF_NOT_TYPE(x, tp)             if (E_OBJECT(x)->type != (int)(tp))
39 # else
40 #  define E_OBJECT_CHECK(x)
41 #  define E_OBJECT_CHECK_RETURN(x, ret)
42 #  define E_OBJECT_TYPE_CHECK(x, type)
43 #  define E_OBJECT_TYPE_CHECK_RETURN(x, type, ret)
44 #  define E_OBJECT_IF_NOT_TYPE(x, type)
45 # endif
46 #endif
47 
48 typedef void (*E_Object_Cleanup_Func) (void *obj);
49 
50 typedef struct _E_Object       E_Object;
51 typedef struct _E_Object_Delfn E_Object_Delfn;
52 
53 #else
54 #ifndef E_OBJECT_H
55 #define E_OBJECT_H
56 
57 struct _E_Object
58 {
59    int                      magic;
60    int                      type;
61    int                      references;
62    E_Object_Cleanup_Func    del_func;
63    E_Object_Cleanup_Func    cleanup_func;
64    E_Object_Cleanup_Func    free_att_func;
65    E_Object_Cleanup_Func    del_att_func;
66    E_Object_Cleanup_Func    del_delay_func;
67    Eina_Inlist             *del_fn_list;
68    void                    *data;
69    Ecore_Job               *delay_del_job;
70    int                      walking_list;
71    Eina_Bool                ref_debug E_BITFIELD;
72    Eina_Bool                deleted E_BITFIELD;
73 };
74 
75 struct _E_Object_Delfn
76 {
77    EINA_INLIST;
78 
79    void (*func) (void *data, void *obj);
80    void  *data;
81    Eina_Bool delete_me E_BITFIELD;
82 };
83 
84 E_API void *e_object_alloc               (int size, int type, E_Object_Cleanup_Func cleanup_func);
85 E_API void  e_object_del                 (E_Object *obj);
86 E_API void  e_object_delay_del_set       (E_Object *obj, void *func);
87 E_API int   e_object_is_del              (E_Object *obj);
88 E_API void  e_object_del_func_set        (E_Object *obj, E_Object_Cleanup_Func del_func);
89 E_API void  e_object_type_set            (E_Object *obj, int type);
90 E_API void  e_object_free                (E_Object *obj);
91 E_API int   e_object_ref                 (E_Object *obj);
92 E_API int   e_object_unref               (E_Object *obj);
93 E_API int   e_object_ref_get             (E_Object *obj);
94 E_API int   e_object_error               (E_Object *obj);
95 E_API void  e_object_data_set            (E_Object *obj, const void *data);
96 E_API void *e_object_data_get            (E_Object *obj);
97 E_API void  e_object_free_attach_func_set(E_Object *obj, E_Object_Cleanup_Func func);
98 E_API void  e_object_del_attach_func_set (E_Object *obj, E_Object_Cleanup_Func func);
99 
100 E_API E_Object_Delfn *e_object_delfn_add (E_Object *obj, void (*func) (void *data, void *obj), void *data);
101 E_API void            e_object_delfn_del (E_Object *obj, E_Object_Delfn *dfn);
102 E_API void            e_object_delfn_clear(E_Object *obj);
103 
104 E_API void e_object_ref_debug_set(E_Object *obj, Eina_Bool set);
105 
106 /*
107 E_API void  e_object_breadcrumb_add      (E_Object *obj, char *crumb);
108 E_API void  e_object_breadcrumb_del      (E_Object *obj, char *crumb);
109 E_API void  e_object_breadcrumb_debug    (E_Object *obj);
110 */
111 
112 #endif
113 #endif
114