From 48339a4e26f071c7227b964f48e4d5600c26af16 Mon Sep 17 00:00:00 2001 From: Quincey Koziol Date: Tue, 14 Sep 2004 00:04:28 -0500 Subject: [svn-r9251] Purpose: Bug fix Description: Correct typedef for dataset region references to avoid struct alignment issues on Crays. Solution: Change the typedef for hdset_reg_ref_t from a struct to an array of unsigned char's of the correct size and propagate the appropriate adjustments around the code. Platforms tested: FreeBSD 4.10 (sleipnir) Linux 2.4 (verbena) w/fortran Cray T90 (subzero) w/fortran Cray SV1 (wind) w/fortran & parallel Cray T3E (cyclone) w/fortran & parallel --- fortran/src/H5Df.c | 8 ++++---- fortran/src/H5Rf.c | 12 ++++++------ src/H5.c | 2 +- src/H5R.c | 20 ++++++++++---------- src/H5Rpublic.h | 9 ++------- 5 files changed, 23 insertions(+), 28 deletions(-) diff --git a/fortran/src/H5Df.c b/fortran/src/H5Df.c index 05c11b9..5ac7d60 100644 --- a/fortran/src/H5Df.c +++ b/fortran/src/H5Df.c @@ -223,7 +223,7 @@ nh5dwrite_ref_obj_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_ buf_c = (hobj_ref_t*)HDmalloc(sizeof(hobj_ref_t)*(n)); if ( buf_c != NULL ) { for (i = 0; i < n; i++) { - HDmemcpy(buf_c[i].oid, buf, H5R_OBJ_REF_BUF_SIZE); + HDmemcpy(&buf_c[i], buf, H5R_OBJ_REF_BUF_SIZE); buf = buf + REF_OBJ_BUF_LEN_F; } } @@ -282,7 +282,7 @@ nh5dwrite_ref_reg_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_ buf_c = (hdset_reg_ref_t *)HDmalloc(sizeof(hdset_reg_ref_t)*(n)); if ( buf_c != NULL ) { for (i = 0; i < n; i++) { - HDmemcpy(buf_c[i].heapid, buf, H5R_DSET_REG_REF_BUF_SIZE); + HDmemcpy(&buf_c[i], buf, H5R_DSET_REG_REF_BUF_SIZE); buf = buf + REF_REG_BUF_LEN_F; } } @@ -420,7 +420,7 @@ nh5dread_ref_obj_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_i ret = H5Dread(c_dset_id, c_mem_type_id, c_mem_space_id, c_file_space_id, c_xfer_prp, buf_c); if (ret >=0) { for (i = 0; i < n; i++) { - HDmemcpy(buf, buf_c[i].oid, H5R_OBJ_REF_BUF_SIZE); + HDmemcpy(buf, &buf_c[i], H5R_OBJ_REF_BUF_SIZE); buf = buf + REF_OBJ_BUF_LEN_F; } } @@ -478,7 +478,7 @@ nh5dread_ref_reg_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_i ret = H5Dread(c_dset_id, c_mem_type_id, c_mem_space_id, c_file_space_id, c_xfer_prp, buf_c); if (ret >=0) { for (i = 0; i < n; i++) { - HDmemcpy(buf, buf_c[i].heapid, H5R_DSET_REG_REF_BUF_SIZE); + HDmemcpy(buf, &buf_c[i], H5R_DSET_REG_REF_BUF_SIZE); buf = buf + REF_REG_BUF_LEN_F; } } diff --git a/fortran/src/H5Rf.c b/fortran/src/H5Rf.c index 852028a..6e0d41a 100644 --- a/fortran/src/H5Rf.c +++ b/fortran/src/H5Rf.c @@ -53,7 +53,7 @@ nh5rcreate_object_c (int_f *ref, hid_t_f *loc_id, _fcd name, int_f *namelen) HDfree(c_name); if (ret_value_c >= 0) { - HDmemcpy(ref, ref_c.oid, H5R_OBJ_REF_BUF_SIZE); + HDmemcpy(ref, &ref_c, H5R_OBJ_REF_BUF_SIZE); ret_value = 0; } @@ -102,7 +102,7 @@ nh5rcreate_region_c (int_f *ref, hid_t_f *loc_id, _fcd name, int_f *namelen, hid HDfree(c_name); if (ret_value_c >= 0) { - HDmemcpy (ref, ref_c.heapid, H5R_DSET_REG_REF_BUF_SIZE); + HDmemcpy (ref, &ref_c, H5R_DSET_REG_REF_BUF_SIZE); ret_value = 0; } return ret_value; @@ -127,7 +127,7 @@ nh5rdereference_region_c (hid_t_f *dset_id, int_f *ref, hid_t_f *obj_id) hdset_reg_ref_t ref_c; hid_t c_obj_id; - HDmemcpy (ref_c.heapid, ref, H5R_DSET_REG_REF_BUF_SIZE); + HDmemcpy (&ref_c, ref, H5R_DSET_REG_REF_BUF_SIZE); /* * Call H5Rdereference function. @@ -160,7 +160,7 @@ nh5rdereference_object_c (hid_t_f *dset_id, int_f *ref, hid_t_f *obj_id) hid_t c_obj_id; hobj_ref_t ref_c; - HDmemcpy (ref_c.oid, ref, H5R_OBJ_REF_BUF_SIZE); + HDmemcpy (&ref_c, ref, H5R_OBJ_REF_BUF_SIZE); /* * Call H5Rdereference function. @@ -192,7 +192,7 @@ nh5rget_region_region_c (hid_t_f *dset_id, int_f *ref, hid_t_f *space_id) hid_t c_space_id; hdset_reg_ref_t ref_c; - HDmemcpy (ref_c.heapid, ref, H5R_DSET_REG_REF_BUF_SIZE); + HDmemcpy (&ref_c, ref, H5R_DSET_REG_REF_BUF_SIZE); /* * Call H5Rget_region function. @@ -225,7 +225,7 @@ nh5rget_object_type_obj_c (hid_t_f *dset_id, int_f *ref, int_f *obj_type) int c_obj_type; hobj_ref_t ref_c; - HDmemcpy (ref_c.oid, ref, H5R_OBJ_REF_BUF_SIZE); + HDmemcpy (&ref_c, ref, H5R_OBJ_REF_BUF_SIZE); /* * Call H5Rget_object_type function. diff --git a/src/H5.c b/src/H5.c index 3a33e4a..37beb7f 100644 --- a/src/H5.c +++ b/src/H5.c @@ -2419,7 +2419,7 @@ H5_trace (const double *returning, const char *func, const char *type, ...) } } else { hobj_ref_t ref = va_arg (ap, hobj_ref_t); - fprintf (out, "Reference Object=%p", (void *)&ref); + HDfprintf(out, "Reference Object=%a", ref); } break; diff --git a/src/H5R.c b/src/H5R.c index 1916edc..8a3c6ff 100644 --- a/src/H5R.c +++ b/src/H5R.c @@ -158,7 +158,7 @@ H5R_create(void *_ref, H5G_entry_t *loc, const char *name, H5R_type_t ref_type, uint8_t *p; /* Pointer to OID to store */ /* Set information for reference */ - p=(uint8_t *)ref->oid; + p=(uint8_t *)ref; H5F_addr_pack(loc->file,&addr,&sb.objno[0]); H5F_addr_encode(loc->file,&p,addr); break; @@ -180,8 +180,8 @@ H5R_create(void *_ref, H5G_entry_t *loc, const char *name, H5R_type_t ref_type, /* Return any previous heap block to the free list if we are garbage collecting */ if(loc->file->shared->gc_ref) { /* Check for an existing heap ID in the reference */ - for(u=0, heapid_found=0; uheapid[u]!=0) { + for(u=0, heapid_found=0, p=(uint8_t *)ref; uheapid,H5R_DSET_REG_REF_BUF_SIZE,0); + HDmemset(ref,H5R_DSET_REG_REF_BUF_SIZE,0); /* Get the amount of space required to serialize the selection */ if ((buf_size = H5S_SELECT_SERIAL_SIZE(space)) < 0) @@ -221,7 +221,7 @@ H5R_create(void *_ref, H5G_entry_t *loc, const char *name, H5R_type_t ref_type, HGOTO_ERROR(H5E_REFERENCE, H5E_WRITEERROR, FAIL, "Unable to serialize selection"); /* Serialize the heap ID and index for storage in the file */ - p=(uint8_t *)ref->heapid; + p=(uint8_t *)ref; H5F_addr_encode(loc->file,&p,hobjid.addr); INT32ENCODE(p,hobjid.idx); @@ -357,7 +357,7 @@ H5R_dereference(H5F_t *file, hid_t dxpl_id, H5R_type_t ref_type, void *_ref) * open a dataset for now */ /* Get the object oid */ - p=(uint8_t *)ref->oid; + p=(uint8_t *)ref; H5F_addr_decode(ent.file,(const uint8_t **)&p,&(ent.header)); } /* end case */ break; @@ -369,7 +369,7 @@ H5R_dereference(H5F_t *file, hid_t dxpl_id, H5R_type_t ref_type, void *_ref) uint8_t *buf; /* Buffer to store serialized selection in */ /* Get the heap ID for the dataset region */ - p=(uint8_t *)ref->heapid; + p=(uint8_t *)ref; H5F_addr_decode(ent.file,(const uint8_t **)&p,&(hobjid.addr)); INT32DECODE(p,hobjid.idx); @@ -536,7 +536,7 @@ H5R_get_region(H5F_t *file, hid_t dxpl_id, H5R_type_t UNUSED ref_type, void *_re ent.file=file; /* Get the heap ID for the dataset region */ - p=(uint8_t *)ref->heapid; + p=(uint8_t *)ref; H5F_addr_decode(ent.file,(const uint8_t **)&p,&(hobjid.addr)); INT32DECODE(p,hobjid.idx); @@ -772,7 +772,7 @@ H5R_get_obj_type(H5F_t *file, hid_t dxpl_id, H5R_type_t ref_type, void *_ref) hobj_ref_t *ref=(hobj_ref_t *)_ref; /* Only object references currently supported */ /* Get the object oid */ - p=(uint8_t *)ref->oid; + p=(uint8_t *)ref; H5F_addr_decode(ent.file,(const uint8_t **)&p,&(ent.header)); } /* end case */ break; @@ -784,7 +784,7 @@ H5R_get_obj_type(H5F_t *file, hid_t dxpl_id, H5R_type_t ref_type, void *_ref) uint8_t *buf; /* Buffer to store serialized selection in */ /* Get the heap ID for the dataset region */ - p=(uint8_t *)ref->heapid; + p=(uint8_t *)ref; H5F_addr_decode(ent.file,(const uint8_t **)&p,&(hobjid.addr)); INT32DECODE(p,hobjid.idx); diff --git a/src/H5Rpublic.h b/src/H5Rpublic.h index 00a1fbd..9cdd56e 100644 --- a/src/H5Rpublic.h +++ b/src/H5Rpublic.h @@ -49,21 +49,16 @@ typedef struct { * them. -QAK */ #define H5R_OBJ_REF_BUF_SIZE sizeof(haddr_t) -/* Object reference structure for user's code */ -typedef struct { - unsigned char oid[H5R_OBJ_REF_BUF_SIZE]; /* Buffer to store OID of object referenced */ +typedef haddr_t hobj_ref_t; /* Buffer to store OID of object referenced */ /* Needs to be large enough to store largest haddr_t in a worst case machine (ie. 8 bytes currently) */ -} hobj_ref_t; #define H5R_DSET_REG_REF_BUF_SIZE (sizeof(haddr_t)+4) /* 4 is used instead of sizeof(int) to permit portability between the Crays and other machines (the heap ID is always encoded as an int32 anyway) */ /* Dataset Region reference structure for user's code */ -typedef struct { - unsigned char heapid[H5R_DSET_REG_REF_BUF_SIZE]; /* Buffer to store heap ID and index */ +typedef unsigned char hdset_reg_ref_t[H5R_DSET_REG_REF_BUF_SIZE];/* Buffer to store heap ID and index */ /* Needs to be large enough to store largest haddr_t in a worst case machine (ie. 8 bytes currently) plus an int */ -} hdset_reg_ref_t; /* Publicly visible datastructures */ -- cgit v0.12