summaryrefslogtreecommitdiffstats
path: root/src/H5Tvlen.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5Tvlen.c')
-rw-r--r--src/H5Tvlen.c133
1 files changed, 69 insertions, 64 deletions
diff --git a/src/H5Tvlen.c b/src/H5Tvlen.c
index 2de8db6..643f36d 100644
--- a/src/H5Tvlen.c
+++ b/src/H5Tvlen.c
@@ -71,6 +71,7 @@ static H5T_vlen_alloc_info_t H5T_vlen_def_vl_alloc_info ={
/* Declare extern the free list for H5T_t's */
H5FL_EXTERN(H5T_t);
+H5FL_EXTERN(H5T_shared_t);
/*--------------------------------------------------------------------------
@@ -170,18 +171,22 @@ H5T_vlen_create(const H5T_t *base)
/* Build new type */
if (NULL==(dt = H5FL_CALLOC(H5T_t)))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+ if (NULL==(dt->shared = H5FL_CALLOC(H5T_shared_t))) {
+ H5FL_FREE(H5T_t, dt);
+ HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL,"memory allocation failed")
+ }
dt->ent.header = HADDR_UNDEF;
- dt->type = H5T_VLEN;
+ dt->shared->type = H5T_VLEN;
/*
* Force conversions (i.e. memory to memory conversions should duplicate
* data, not point to the same VL sequences)
*/
- dt->force_conv = TRUE;
- dt->parent = H5T_copy(base, H5T_COPY_ALL);
+ dt->shared->force_conv = TRUE;
+ dt->shared->parent = H5T_copy(base, H5T_COPY_ALL);
/* This is a sequence, not a string */
- dt->u.vlen.type = H5T_VLEN_SEQUENCE;
+ dt->shared->u.vlen.type = H5T_VLEN_SEQUENCE;
/* Set up VL information */
if (H5T_vlen_mark(dt, NULL, H5T_VLEN_MEMORY)<0)
@@ -225,7 +230,7 @@ H5T_vlen_set_loc(H5T_t *dt, H5F_t *f, H5T_vlen_loc_t loc)
assert(loc>H5T_VLEN_BADLOC && loc<H5T_VLEN_MAXLOC);
/* Only change the location if it's different */
- if(loc!=dt->u.vlen.loc) {
+ if(loc!=dt->shared->u.vlen.loc) {
/* Indicate that the location changed */
ret_value=TRUE;
@@ -234,62 +239,62 @@ H5T_vlen_set_loc(H5T_t *dt, H5F_t *f, H5T_vlen_loc_t loc)
assert(f==NULL);
/* Mark this type as being stored in memory */
- dt->u.vlen.loc=H5T_VLEN_MEMORY;
+ dt->shared->u.vlen.loc=H5T_VLEN_MEMORY;
- if(dt->u.vlen.type==H5T_VLEN_SEQUENCE) {
+ if(dt->shared->u.vlen.type==H5T_VLEN_SEQUENCE) {
/* size in memory, disk size is different */
- dt->size = sizeof(hvl_t);
+ dt->shared->size = sizeof(hvl_t);
/* Set up the function pointers to access the VL sequence in memory */
- dt->u.vlen.getlen=H5T_vlen_seq_mem_getlen;
- dt->u.vlen.getptr=H5T_vlen_seq_mem_getptr;
- dt->u.vlen.isnull=H5T_vlen_seq_mem_isnull;
- dt->u.vlen.read=H5T_vlen_seq_mem_read;
- dt->u.vlen.write=H5T_vlen_seq_mem_write;
- dt->u.vlen.setnull=H5T_vlen_seq_mem_setnull;
- } else if(dt->u.vlen.type==H5T_VLEN_STRING) {
+ dt->shared->u.vlen.getlen=H5T_vlen_seq_mem_getlen;
+ dt->shared->u.vlen.getptr=H5T_vlen_seq_mem_getptr;
+ dt->shared->u.vlen.isnull=H5T_vlen_seq_mem_isnull;
+ dt->shared->u.vlen.read=H5T_vlen_seq_mem_read;
+ dt->shared->u.vlen.write=H5T_vlen_seq_mem_write;
+ dt->shared->u.vlen.setnull=H5T_vlen_seq_mem_setnull;
+ } else if(dt->shared->u.vlen.type==H5T_VLEN_STRING) {
/* size in memory, disk size is different */
- dt->size = sizeof(char *);
+ dt->shared->size = sizeof(char *);
/* Set up the function pointers to access the VL string in memory */
- dt->u.vlen.getlen=H5T_vlen_str_mem_getlen;
- dt->u.vlen.getptr=H5T_vlen_str_mem_getptr;
- dt->u.vlen.isnull=H5T_vlen_str_mem_isnull;
- dt->u.vlen.read=H5T_vlen_str_mem_read;
- dt->u.vlen.write=H5T_vlen_str_mem_write;
- dt->u.vlen.setnull=H5T_vlen_str_mem_setnull;
+ dt->shared->u.vlen.getlen=H5T_vlen_str_mem_getlen;
+ dt->shared->u.vlen.getptr=H5T_vlen_str_mem_getptr;
+ dt->shared->u.vlen.isnull=H5T_vlen_str_mem_isnull;
+ dt->shared->u.vlen.read=H5T_vlen_str_mem_read;
+ dt->shared->u.vlen.write=H5T_vlen_str_mem_write;
+ dt->shared->u.vlen.setnull=H5T_vlen_str_mem_setnull;
} else {
assert(0 && "Invalid VL type");
}
/* Reset file ID (since this VL is in memory) */
- dt->u.vlen.f=NULL;
+ dt->shared->u.vlen.f=NULL;
break;
case H5T_VLEN_DISK: /* Disk based VL datatype */
assert(f);
/* Mark this type as being stored on disk */
- dt->u.vlen.loc=H5T_VLEN_DISK;
+ dt->shared->u.vlen.loc=H5T_VLEN_DISK;
/*
* Size of element on disk is 4 bytes for the length, plus the size
* of an address in this file, plus 4 bytes for the size of a heap
* ID. Memory size is different
*/
- dt->size = 4 + H5F_SIZEOF_ADDR(f) + 4;
+ dt->shared->size = 4 + H5F_SIZEOF_ADDR(f) + 4;
/* Set up the function pointers to access the VL information on disk */
/* VL sequences and VL strings are stored identically on disk, so use the same functions */
- dt->u.vlen.getlen=H5T_vlen_disk_getlen;
- dt->u.vlen.getptr=H5T_vlen_disk_getptr;
- dt->u.vlen.isnull=H5T_vlen_disk_isnull;
- dt->u.vlen.read=H5T_vlen_disk_read;
- dt->u.vlen.write=H5T_vlen_disk_write;
- dt->u.vlen.setnull=H5T_vlen_disk_setnull;
+ dt->shared->u.vlen.getlen=H5T_vlen_disk_getlen;
+ dt->shared->u.vlen.getptr=H5T_vlen_disk_getptr;
+ dt->shared->u.vlen.isnull=H5T_vlen_disk_isnull;
+ dt->shared->u.vlen.read=H5T_vlen_disk_read;
+ dt->shared->u.vlen.write=H5T_vlen_disk_write;
+ dt->shared->u.vlen.setnull=H5T_vlen_disk_setnull;
/* Set file ID (since this VL is on disk) */
- dt->u.vlen.f=f;
+ dt->shared->u.vlen.f=f;
break;
default:
@@ -1013,16 +1018,16 @@ H5T_vlen_reclaim_recurse(void *elem, const H5T_t *dt, H5MM_free_t free_func, voi
assert(dt);
/* Check the datatype of this element */
- switch(dt->type) {
+ switch(dt->shared->type) {
case H5T_ARRAY:
/* Recurse on each element, if the array's base type is array, VL, enum or compound */
- if(H5T_IS_COMPLEX(dt->parent->type)) {
+ if(H5T_IS_COMPLEX(dt->shared->parent->shared->type)) {
void *off; /* offset of field */
/* Calculate the offset member and recurse on it */
- for(i=0; i<dt->u.array.nelem; i++) {
- off=((uint8_t *)elem)+i*(dt->parent->size);
- if(H5T_vlen_reclaim_recurse(off,dt->parent,free_func,free_info)<0)
+ for(i=0; i<dt->shared->u.array.nelem; i++) {
+ off=((uint8_t *)elem)+i*(dt->shared->parent->shared->size);
+ if(H5T_vlen_reclaim_recurse(off,dt->shared->parent,free_func,free_info)<0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTFREE, FAIL, "Unable to free array element")
} /* end for */
} /* end if */
@@ -1030,14 +1035,14 @@ H5T_vlen_reclaim_recurse(void *elem, const H5T_t *dt, H5MM_free_t free_func, voi
case H5T_COMPOUND:
/* Check each field and recurse on VL, compound, enum or array ones */
- for (i=0; i<(unsigned)dt->u.compnd.nmembs; i++) {
+ for (i=0; i<(unsigned)dt->shared->u.compnd.nmembs; i++) {
/* Recurse if it's VL, compound, enum or array */
- if(H5T_IS_COMPLEX(dt->u.compnd.memb[i].type->type)) {
+ if(H5T_IS_COMPLEX(dt->shared->u.compnd.memb[i].type->shared->type)) {
void *off; /* offset of field */
/* Calculate the offset member and recurse on it */
- off=((uint8_t *)elem)+dt->u.compnd.memb[i].offset;
- if(H5T_vlen_reclaim_recurse(off,dt->u.compnd.memb[i].type,free_func,free_info)<0)
+ off=((uint8_t *)elem)+dt->shared->u.compnd.memb[i].offset;
+ if(H5T_vlen_reclaim_recurse(off,dt->shared->u.compnd.memb[i].type,free_func,free_info)<0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTFREE, FAIL, "Unable to free compound field")
} /* end if */
} /* end for */
@@ -1045,19 +1050,19 @@ H5T_vlen_reclaim_recurse(void *elem, const H5T_t *dt, H5MM_free_t free_func, voi
case H5T_VLEN:
/* Recurse on the VL information if it's VL, compound, enum or array, then free VL sequence */
- if(dt->u.vlen.type==H5T_VLEN_SEQUENCE) {
+ if(dt->shared->u.vlen.type==H5T_VLEN_SEQUENCE) {
hvl_t *vl=(hvl_t *)elem; /* Temp. ptr to the vl info */
/* Check if there is anything actually in this sequence */
if(vl->len!=0) {
/* Recurse if it's VL, array, enum or compound */
- if(H5T_IS_COMPLEX(dt->parent->type)) {
+ if(H5T_IS_COMPLEX(dt->shared->parent->shared->type)) {
void *off; /* offset of field */
/* Calculate the offset of each array element and recurse on it */
while(vl->len>0) {
- off=((uint8_t *)vl->p)+(vl->len-1)*dt->parent->size;
- if(H5T_vlen_reclaim_recurse(off,dt->parent,free_func,free_info)<0)
+ off=((uint8_t *)vl->p)+(vl->len-1)*dt->shared->parent->shared->size;
+ if(H5T_vlen_reclaim_recurse(off,dt->shared->parent,free_func,free_info)<0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTFREE, FAIL, "Unable to free VL element")
vl->len--;
} /* end while */
@@ -1069,7 +1074,7 @@ H5T_vlen_reclaim_recurse(void *elem, const H5T_t *dt, H5MM_free_t free_func, voi
else
H5MM_xfree(vl->p);
} /* end if */
- } else if(dt->u.vlen.type==H5T_VLEN_STRING) {
+ } else if(dt->shared->u.vlen.type==H5T_VLEN_STRING) {
/* Free the VL string */
if(free_func!=NULL)
(*free_func)(*(char **)elem,free_info);
@@ -1236,71 +1241,71 @@ H5T_vlen_mark(H5T_t *dt, H5F_t *f, H5T_vlen_loc_t loc)
assert(loc>H5T_VLEN_BADLOC && loc<H5T_VLEN_MAXLOC);
/* Check the datatype of this element */
- switch(dt->type) {
+ switch(dt->shared->type) {
case H5T_ARRAY: /* Recurse on VL, compound and array base element type */
/* Recurse if it's VL, compound or array */
/* (If the type is compound and the force_conv flag is _not_ set, the type cannot change in size, so don't recurse) */
- if(dt->parent->force_conv && H5T_IS_COMPLEX(dt->parent->type)) {
+ if(dt->shared->parent->shared->force_conv && H5T_IS_COMPLEX(dt->shared->parent->shared->type)) {
/* Keep the old base element size for later */
- old_size=dt->parent->size;
+ old_size=dt->shared->parent->shared->size;
/* Mark the VL, compound or array type */
- if((vlen_changed=H5T_vlen_mark(dt->parent,f,loc))<0)
+ if((vlen_changed=H5T_vlen_mark(dt->shared->parent,f,loc))<0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "Unable to set VL location");
if(vlen_changed>0)
ret_value=vlen_changed;
/* Check if the field changed size */
- if(old_size != dt->parent->size) {
+ if(old_size != dt->shared->parent->shared->size) {
/* Adjust the size of the array */
- dt->size = dt->u.array.nelem*dt->parent->size;
+ dt->shared->size = dt->shared->u.array.nelem*dt->shared->parent->shared->size;
} /* end if */
} /* end if */
break;
case H5T_COMPOUND: /* Check each field and recurse on VL, compound and array type */
/* Compound datatypes can't change in size if the force_conv flag is not set */
- if(dt->force_conv) {
+ if(dt->shared->force_conv) {
/* Sort the fields based on offsets */
H5T_sort_value(dt,NULL);
- for (i=0; i<dt->u.compnd.nmembs; i++) {
+ for (i=0; i<dt->shared->u.compnd.nmembs; i++) {
/* Apply the accumulated size change to the offset of the field */
- dt->u.compnd.memb[i].offset += accum_change;
+ dt->shared->u.compnd.memb[i].offset += accum_change;
/* Recurse if it's VL, compound, enum or array */
/* (If the force_conv flag is _not_ set, the type cannot change in size, so don't recurse) */
- if(dt->u.compnd.memb[i].type->force_conv && H5T_IS_COMPLEX(dt->u.compnd.memb[i].type->type)) {
+ if(dt->shared->u.compnd.memb[i].type->shared->force_conv && H5T_IS_COMPLEX(dt->shared->u.compnd.memb[i].type->shared->type)) {
/* Keep the old field size for later */
- old_size=dt->u.compnd.memb[i].type->size;
+ old_size=dt->shared->u.compnd.memb[i].type->shared->size;
/* Mark the VL, compound, enum or array type */
- if((vlen_changed=H5T_vlen_mark(dt->u.compnd.memb[i].type,f,loc))<0)
+ if((vlen_changed=H5T_vlen_mark(dt->shared->u.compnd.memb[i].type,f,loc))<0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "Unable to set VL location");
if(vlen_changed>0)
ret_value=vlen_changed;
/* Check if the field changed size */
- if(old_size != dt->u.compnd.memb[i].type->size) {
+ if(old_size != dt->shared->u.compnd.memb[i].type->shared->size) {
/* Adjust the size of the member */
- dt->u.compnd.memb[i].size = (dt->u.compnd.memb[i].size*dt->u.compnd.memb[i].type->size)/old_size;
+ dt->shared->u.compnd.memb[i].size = (dt->shared->u.compnd.memb[i].size*dt->shared->u.compnd.memb[i].type->shared->size)/old_size;
/* Add that change to the accumulated size change */
- accum_change += (dt->u.compnd.memb[i].type->size - (int)old_size);
+ accum_change += (dt->shared->u.compnd.memb[i].type->shared->size - (int)old_size);
} /* end if */
} /* end if */
} /* end for */
/* Apply the accumulated size change to the datatype */
- dt->size += accum_change;
+ dt->shared->size += accum_change;
} /* end if */
break;
case H5T_VLEN: /* Recurse on the VL information if it's VL, compound or array, then free VL sequence */
/* Recurse if it's VL, compound or array */
/* (If the force_conv flag is _not_ set, the type cannot change in size, so don't recurse) */
- if(dt->parent->force_conv && H5T_IS_COMPLEX(dt->parent->type)) {
- if((vlen_changed=H5T_vlen_mark(dt->parent,f,loc))<0)
+ if(dt->shared->parent->shared->force_conv && H5T_IS_COMPLEX(dt->shared->parent->shared->type)) {
+ if((vlen_changed=H5T_vlen_mark(dt->shared->parent,f,loc))<0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "Unable to set VL location");
if(vlen_changed>0)
ret_value=vlen_changed;