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