diff --git a/src/mapping.c b/src/mapping.c index 0deb643e1b585e21509c7191bf55879c114d63f3..1dafd34d0ca44d0efb334ada111a9c3ccb8e9e4d 100644 --- a/src/mapping.c +++ b/src/mapping.c @@ -5,7 +5,7 @@ \*/ /**/ #include "global.h" -RCSID("$Id: mapping.c,v 1.114 2001/01/18 02:18:57 hubbe Exp $"); +RCSID("$Id: mapping.c,v 1.115 2001/01/25 08:37:59 hubbe Exp $"); #include "main.h" #include "object.h" #include "mapping.h" @@ -105,12 +105,15 @@ static void check_mapping_type_fields(struct mapping *m) #endif static struct mapping_data empty_data = { 1, 1, 0,0,0,0,0,0 }; +static struct mapping_data weak_empty_data = { 1, 1, 0,0,0,0,0,0,1 }; /* This function allocates the hash table and svalue space for a mapping * struct. The size is the max number of indices that can fit in the * allocated space. */ -static void init_mapping(struct mapping *m, INT32 size) +static void init_mapping(struct mapping *m, + INT32 size, + INT16 flags) { struct mapping_data *md; char *tmp; @@ -149,14 +152,19 @@ static void init_mapping(struct mapping *m, INT32 size) md->free_list[e-1].val.type=T_INT; md->ind_types = 0; md->val_types = 0; - md->flags = 0; + md->flags = flags; md->size = 0; md->refs=0; md->valrefs=0; md->hardlinks=0; md->num_keypairs=size; }else{ - md=&empty_data; + if(flags & MAPPING_FLAG_WEAK) + { + md=&weak_empty_data; + }else{ + md=&empty_data; + } } add_ref(md); m->data=md; @@ -176,7 +184,7 @@ PMOD_EXPORT struct mapping *debug_allocate_mapping(int size) GC_ALLOC(m); INITIALIZE_PROT(m); - init_mapping(m,size); + init_mapping(m,size,0); m->refs = 1; @@ -306,10 +314,9 @@ static struct mapping *rehash(struct mapping *m, int new_size) if(d_flag>1) check_mapping(m); #endif - init_mapping(m, new_size); + init_mapping(m, new_size, md->flags); debug_malloc_touch(m); new_md=m->data; - new_md->flags = md->flags; /* This operation is now 100% atomic - no locking required */ if(md->refs>1) @@ -556,6 +563,18 @@ PMOD_EXPORT void mapping_set_flags(struct mapping *m, int flags) struct keypair *k = NULL, *prev = NULL; COPYMAP2(); } +#ifdef PIKE_DEBUG + if(flags & MAPPING_FLAG_WEAK) + { + debug_malloc_touch(m); + debug_malloc_touch(md); + } + else + { + debug_malloc_touch(m); + debug_malloc_touch(md); + } +#endif md->flags = flags; }