Main Page | Class List | Directories | File List | Class Members | File Members

object.h

Go to the documentation of this file.
00001 /*
00002 || This file is part of Pike. For copyright information see COPYRIGHT.
00003 || Pike is distributed under GPL, LGPL and MPL. See the file COPYING
00004 || for more information.
00005 || $Id: object.h,v 1.91 2005/04/08 16:55:53 grubba Exp $
00006 */
00007 
00008 #ifndef OBJECT_H
00009 #define OBJECT_H
00010 
00011 #include "global.h"
00012 #include "svalue.h"
00013 #include "dmalloc.h"
00014 
00015 /* a destructed object has no program */
00016 
00017 #ifndef STRUCT_OBJECT_DECLARED
00018 #define STRUCT_OBJECT_DECLARED
00019 #endif
00020 struct object
00021 {
00022   PIKE_MEMORY_OBJECT_MEMBERS; /* Must be first */
00023   struct program *prog;
00024   struct object *next;
00025   struct object *prev;
00026 #ifdef PIKE_DEBUG
00027   INT32 program_id;
00028 #endif
00029   char *storage;
00030 };
00031 
00032 PMOD_EXPORT extern struct object *first_object;
00033 extern struct object *gc_internal_object;
00034 extern struct object *objects_to_destruct;
00035 extern struct object *master_object;
00036 extern struct program *master_program;
00037 extern struct program *magic_index_program;
00038 extern struct program *magic_set_index_program;
00039 extern struct program *magic_indices_program;
00040 extern struct program *magic_values_program;
00041 #ifdef DO_PIKE_CLEANUP
00042 extern int gc_external_refs_zapped;
00043 void gc_check_zapped (void *a, TYPE_T type, const char *file, int line);
00044 #endif
00045 
00046 #define free_object(O) do{                                              \
00047     struct object *o_=(O);                                              \
00048     debug_malloc_touch(o_);                                             \
00049     debug_malloc_touch(o_->storage);                                    \
00050     DO_IF_DEBUG (                                                       \
00051       DO_IF_PIKE_CLEANUP (                                              \
00052         if (gc_external_refs_zapped)                                    \
00053           gc_check_zapped (o_, PIKE_T_OBJECT, __FILE__, __LINE__)));    \
00054     if(!sub_ref(o_))                                                    \
00055       schedule_really_free_object(o_);                                  \
00056   }while(0)
00057 
00058 #ifdef DEBUG_MALLOC
00059 #define PIKE_OBJ_STORAGE(O) ((char *)debug_malloc_pass( (O)->storage ))
00060 #else
00061 #define PIKE_OBJ_STORAGE(O) ((O)->storage)
00062 #endif
00063 
00064 #define LOW_GET_GLOBAL(O,I,ID) (PIKE_OBJ_STORAGE((O))+INHERIT_FROM_INT((O)->prog, (I))->storage_offset+(ID)->func.offset)
00065 #define GET_GLOBAL(O,I) LOW_GET_GLOBAL(O,I,ID_FROM_INT((O)->prog,I))
00066 
00067 #define this_object() (add_ref(Pike_fp->current_object), Pike_fp->current_object)
00068 
00069 enum object_destruct_reason {
00070   DESTRUCT_EXPLICIT = 0,
00071   DESTRUCT_CLEANUP = 1,
00072   DESTRUCT_NO_REFS,
00073   DESTRUCT_GC
00074 };
00075 
00076 #include "block_alloc_h.h"
00077 /* Prototypes begin here */
00078 BLOCK_ALLOC_FILL_PAGES(object, 2);
00079 PMOD_EXPORT struct object *low_clone(struct program *p);
00080 PMOD_EXPORT void call_c_initializers(struct object *o);
00081 void call_prog_event(struct object *o, int event);
00082 void call_pike_initializers(struct object *o, int args);
00083 PMOD_EXPORT void do_free_object(struct object *o);
00084 PMOD_EXPORT struct object *debug_clone_object(struct program *p, int args);
00085 PMOD_EXPORT struct object *fast_clone_object(struct program *p);
00086 PMOD_EXPORT struct object *parent_clone_object(struct program *p,
00087                                                struct object *parent,
00088                                                ptrdiff_t parent_identifier,
00089                                                int args);
00090 PMOD_EXPORT struct object *clone_object_from_object(struct object *o, int args);
00091 struct object *decode_value_clone_object(struct svalue *prog);
00092 PMOD_EXPORT struct object *get_master(void);
00093 PMOD_EXPORT struct object *debug_master(void);
00094 struct destroy_called_mark;
00095 PTR_HASH_ALLOC(destroy_called_mark,128);
00096 PMOD_EXPORT struct program *get_program_for_object_being_destructed(struct object * o);
00097 PMOD_EXPORT void destruct_object (struct object *o, enum object_destruct_reason reason);
00098 #define destruct(o) destruct_object (o, DESTRUCT_EXPLICIT)
00099 void low_destruct_objects_to_destruct(void);
00100 void destruct_objects_to_destruct_cb(void);
00101 PMOD_EXPORT void schedule_really_free_object(struct object *o);
00102 PMOD_EXPORT void low_object_index_no_free(struct svalue *to,
00103                                           struct object *o,
00104                                           ptrdiff_t f);
00105 PMOD_EXPORT void object_index_no_free2(struct svalue *to,
00106                           struct object *o,
00107                           struct svalue *key);
00108 PMOD_EXPORT void object_index_no_free(struct svalue *to,
00109                            struct object *o,
00110                            struct svalue *key);
00111 PMOD_EXPORT void object_low_set_index(struct object *o,
00112                           int f,
00113                           struct svalue *from);
00114 PMOD_EXPORT void object_set_index2(struct object *o,
00115                       struct svalue *key,
00116                       struct svalue *from);
00117 PMOD_EXPORT void object_set_index(struct object *o,
00118                        struct svalue *key,
00119                        struct svalue *from);
00120 union anything *object_get_item_ptr(struct object *o,
00121                                     struct svalue *key,
00122                                     TYPE_T type);
00123 PMOD_EXPORT int object_equal_p(struct object *a, struct object *b, struct processing *p);
00124 PMOD_EXPORT struct array *object_indices(struct object *o);
00125 PMOD_EXPORT struct array *object_values(struct object *o);
00126 PMOD_EXPORT void gc_mark_object_as_referenced(struct object *o);
00127 PMOD_EXPORT void real_gc_cycle_check_object(struct object *o, int weak);
00128 unsigned gc_touch_all_objects(void);
00129 void gc_check_all_objects(void);
00130 void gc_mark_all_objects(void);
00131 void gc_cycle_check_all_objects(void);
00132 void gc_zap_ext_weak_refs_in_objects(void);
00133 size_t gc_free_all_unreferenced_objects(void);
00134 struct magic_index_struct;
00135 void push_magic_index(struct program *type, int inherit_no, int parent_level);
00136 void init_object(void);
00137 void exit_object(void);
00138 void check_object_context(struct object *o,
00139                           struct program *context_prog,
00140                           char *current_storage);
00141 void check_object(struct object *o);
00142 void check_all_objects(void);
00143 /* Prototypes end here */
00144 
00145 #ifdef DEBUG_MALLOC
00146 #define clone_object(X,Y) ((struct object *)debug_malloc_pass(debug_clone_object((X),(Y))))
00147 #else
00148 #define clone_object debug_clone_object
00149 #endif
00150 
00151 #ifdef PIKE_DEBUG
00152 #define master() ( get_master() ? get_master() : ( Pike_fatal("Couldn't load master object at %s:%d.\n",__FILE__,__LINE__), (struct object *)NULL) )
00153 #else
00154 #define master() debug_master()
00155 #endif
00156 
00157 #define gc_cycle_check_object(X, WEAK) \
00158   gc_cycle_enqueue((gc_cycle_check_cb *) real_gc_cycle_check_object, (X), (WEAK))
00159 
00160 #define PIKE_OBJ_DESTRUCTED(o) (!(o)->prog)
00161 #define PIKE_OBJ_INITED(o) (o->prog && (o->prog->flags & PROGRAM_PASS_1_DONE) && !((o->prog->flags & PROGRAM_AVOID_CHECK)))
00162 #define destruct_objects_to_destruct() do{ if(objects_to_destruct) low_destruct_objects_to_destruct(); }while(0)
00163 
00164 #define low_index_current_object_no_free(TO, FUN)                       \
00165   low_object_index_no_free((TO), Pike_fp->current_object,               \
00166                            Pike_fp->context.identifier_level + (FUN))
00167 
00168 
00169 #endif /* OBJECT_H */

Generated on Fri Jul 22 23:44:26 2005 for Pike by  doxygen 1.3.9.1