Merge pull request #1 in ~BMRIBLER/hdf5_bmr_packet_table from HDFFV-8882-replace-numeric-exit-code-with to develop

Accidentally in the wrong branch so merging over to "develop" now.

* commit 'be613da6b804e56a51f43a053bf35d898dccb420':
  Miscellaneous code cleanup. Platforms tested:     Linux/32 2.6 (jam)     Darwin (osx1010test)
  Description:     - Removed calls to H5Tget_native_type in the PT code. The application would     need to do that if desired.     - Added Abhi's program to tests to verify the fix.     - This fix might have fixed HDFFV-9927, HDFFV-9042, and the issue reported       by Barbara Jones from Ametek as well. Platforms tested:     Linux/32 2.6 (jam)     Linux/64 (jelly)     Darwin (osx1010test)
This commit is contained in:
Binh-Minh Ribler
2016-10-23 17:13:52 -05:00
5 changed files with 169 additions and 118 deletions

View File

@@ -52,9 +52,7 @@ int main(void)
num_errors += SystemTest();
#ifdef VLPT_REMOVED
num_errors += VariableLengthTest();
#endif /* VLPT_REMOVED */
num_errors += TestHDFFV_9758();
/* Terminate access to the file. */
err = H5Fclose(fileID);
@@ -562,73 +560,128 @@ error:
return 1;
}
#ifdef VLPT_REMOVED
int VariableLengthTest(void)
/*-------------------------------------------------------------------------
* TestHDFFV_9758(): Test that a packet table with compound datatype which
* contain string type can be created and written correctly. (HDFFV-9758)
*
* Notes:
* Previously, data of the field that follows the string was read back
* as garbage when #pragma pack(1) is used.
* 2016/10/20 -BMR
*-------------------------------------------------------------------------
*/
#pragma pack(1) // no padding
const char* ABHI_PT("/abhiTest");
const hsize_t NUM_PACKETS = 5;
const int STRING_LENGTH = 19; // including terminating NULL
int TestHDFFV_9758()
{
long test_long;
short test_short;
hvl_t read_buf;
VL_PacketTable* test_VLPT;
PacketTable* new_pt;
hid_t strtype;
hid_t compound_type;
herr_t err;
struct s1_t
{
int a;
float b;
double c;
char d[STRING_LENGTH]; // null terminated string
int e;
};
TESTING("variable-length packet tables")
s1_t s1[NUM_PACKETS];
for (hsize_t i = 0; i < NUM_PACKETS; i++)
{
s1[i].a = i;
s1[i].b = 1.f * static_cast<float>(i * i);
s1[i].c = 1. / (i + 1);
sprintf(s1[i].d, "string%d", (int)i);
s1[i].e = 100+i;
}
/* Create a variable length table */
test_VLPT = new VL_PacketTable(fileID, "/VariableLengthTest", 1);
TESTING("the fix of issue HDFFV-9758")
/* Verify that the creation succeeded */
if(! test_VLPT->IsValid())
goto error;
FL_PacketTable wrapper(fileID, H5P_DEFAULT, ABHI_PT, H5T_NATIVE_INT, 1);
if(! wrapper.IsValid())
goto error;
/* Append some packets */
test_short = 9;
test_VLPT->AppendPacket(&test_short, sizeof(short));
test_long = 16;
test_VLPT->AppendPacket(&test_long, sizeof(long));
compound_type = H5Tcreate(H5T_COMPOUND, sizeof(s1_t));
if (compound_type < 0)
goto error;
err = H5Tinsert(compound_type, "a_name", HOFFSET(s1_t, a), H5T_NATIVE_INT);
if (err < 0)
goto error;
err = H5Tinsert(compound_type, "b_name", HOFFSET(s1_t, b), H5T_NATIVE_FLOAT);
if (err < 0)
goto error;
err = H5Tinsert(compound_type, "c_name", HOFFSET(s1_t, c), H5T_NATIVE_DOUBLE);
if (err < 0)
goto error;
/* Read them back and make sure they are correct */
test_VLPT->GetNextPackets(1, &read_buf);
strtype = H5Tcopy (H5T_C_S1);
if (compound_type < 0)
goto error;
err = H5Tset_size (strtype, STRING_LENGTH); /* create string */
if (err < 0)
goto error;
err = H5Tinsert(compound_type, "d_name", HOFFSET(s1_t, d), strtype);
if (err < 0)
goto error;
err = H5Tinsert(compound_type, "e_name", HOFFSET(s1_t, e), H5T_NATIVE_INT);
if (err < 0)
goto error;
if(read_buf.len != sizeof(short))
goto error;
if(*(short *)(read_buf.p) != test_short)
goto error;
{ // so ptable will go out of scope
FL_PacketTable ptable(fileID, "/examplePacketTable", compound_type, 1);
if (not ptable.IsValid())
goto error;
/* Free the memory used by the read */
test_VLPT->FreeReadbuff(1, &read_buf);
for (size_t i = 0; i < NUM_PACKETS; i++)
{
/* Appends one packet at the current position */
err = ptable.AppendPacket(s1 + i);
if (err < 0) goto error;
}
/* Read the second record */
test_VLPT->GetNextPackets(1, &read_buf);
const hsize_t count = ptable.GetPacketCount(err);
if (err < 0)
goto error;
if (count != NUM_PACKETS)
{
std::cerr
<< "Number of packets in packet table should be " << NUM_PACKETS
<< " but is " << count << endl;
}
if(read_buf.len != sizeof(long))
goto error;
if(*(long *)(read_buf.p) != test_long)
goto error;
ptable.ResetIndex();
/* Free the memory used by the read */
test_VLPT->FreeReadbuff(1, &read_buf);
for (size_t i = 0; i < NUM_PACKETS; i++)
{
s1_t s2;
memset(&s2, 0, sizeof(s1_t));
err = ptable.GetNextPacket(&s2);
if (err < 0)
goto error;
/* Close the packet table */
delete test_VLPT;
/* Reopen the packet table and verify that it is variable length */
new_pt = new PacketTable(fileID, "/VariableLengthTest");
/* Verify that the open succeeded */
if(! new_pt->IsValid())
goto error;
if(new_pt->IsVariableLength() != 1)
goto error;
/* Close the packet table */
delete new_pt;
if (s2.a != s1[i].a || s2.e != s1[i].e)
goto error;
else if (HDstrcmp(s2.d, s1[i].d))
goto error;
}
}
PASSED();
return 0;
error:
H5E_BEGIN_TRY {
H5Fclose(fileID);
} H5E_END_TRY;
H5_FAILED();
return 1;
}
#endif /* VLPT_REMOVED */

View File

@@ -52,7 +52,8 @@ int TestGetPacket(void);
Test for unusual interactions between multiple packet tables. */
int SystemTest(void);
/* Test the variable length dataset functionality */
int VariableLengthTest(void);
/* Create a packet table with compound type, which has a string type. Verify
that data was written and read correctly. */
int TestHDFFV_9758(void);
#endif /* PTABLETEST */

View File

@@ -141,7 +141,9 @@ hid_t H5PTcreate(hid_t loc_id,
if(H5Pclose(plistcopy_id) < 0)
goto error;
if((table->type_id = H5Tget_native_type(dtype_id, H5T_DIR_DEFAULT)) < 0)
/* Make a copy of caller's datatype and save it in the table structure.
It will be closed when the table is closed */
if((table->type_id = H5Tcopy(dtype_id)) < 0)
goto error;
H5PT_create_index(table);
@@ -259,12 +261,11 @@ hid_t H5PTcreate_fl ( hid_t loc_id,
if(H5Pclose(plist_id) < 0)
goto error;
/* Make a copy of caller's datatype and save it in the table structure.
It will be closed when the table is closed */
if((table->type_id = H5Tcopy(dtype_id)) < 0)
goto error;
if((table->type_id = H5Tget_native_type(table->type_id, H5T_DIR_DEFAULT)) < 0)
goto error;
H5PT_create_index(table);
table->size = 0;
@@ -352,8 +353,9 @@ hid_t H5PTopen( hid_t loc_id,
if((type_id = H5Dget_type(table->dset_id)) < 0)
goto error;
/* Get the table's native datatype */
if((table->type_id = H5Tget_native_type(type_id, H5T_DIR_ASCEND)) < 0)
/* Make a copy of the datatype obtained and save it in the table structure.
It will be closed when the table is closed */
if((table->type_id = H5Tcopy(type_id)) < 0)
goto error;
/* Close the disk datatype */

View File

@@ -95,8 +95,10 @@ make_particle_type(void)
return FAIL;
/* Insert fields. */
string_type = H5Tcopy( H5T_C_S1 );
H5Tset_size( string_type, (size_t)16 );
if ((string_type = H5Tcopy(H5T_C_S1)) < 0)
return FAIL;
if (H5Tset_size(string_type, (size_t)16) < 0)
return FAIL;
if ( H5Tinsert(type_id, "Name", HOFFSET(particle_t, name) , string_type ) < 0 )
return FAIL;
@@ -133,8 +135,10 @@ static int create_hl_table(hid_t fid)
herr_t status;
/* Initialize the field field_type */
string_type = H5Tcopy( H5T_C_S1 );
H5Tset_size( string_type, (size_t)16 );
if ((string_type = H5Tcopy(H5T_C_S1)) < 0)
return FAIL;
if (H5Tset_size(string_type, (size_t)16) < 0)
return FAIL;
field_type[0] = string_type;
field_type[1] = H5T_NATIVE_INT;
field_type[2] = H5T_NATIVE_INT;
@@ -152,12 +156,14 @@ static int create_hl_table(hid_t fid)
field_names, part_offset, field_type,
chunk_size, fill_data, compress, testPart );
if(status<0)
return FAIL;
else
return SUCCEED;
}
if (H5Tclose(string_type) < 0)
return FAIL;
if(status<0)
return FAIL;
else
return SUCCEED;
}
/*-------------------------------------------------------------------------
@@ -183,7 +189,8 @@ static int test_create_close(hid_t fid)
/* Create the table */
table = H5PTcreate_fl(fid, PT_NAME, part_t, (hsize_t)100, -1);
H5Tclose(part_t);
if (H5Tclose(part_t) < 0)
goto error;
if( H5PTis_valid(table) < 0)
goto error;
if( H5PTis_varlen(table) != 0)
@@ -248,7 +255,7 @@ static int test_append(hid_t fid)
{
herr_t err;
hid_t table;
hsize_t count;
hsize_t count = 0;
TESTING("H5PTappend");
@@ -458,7 +465,8 @@ static int test_big_table(hid_t fid)
/* Create a new table */
table = H5PTcreate_fl(fid, "Packet Test Dataset2", part_t, (hsize_t)33, -1);
H5Tclose(part_t);
if (H5Tclose(part_t) < 0)
goto error;
if( H5PTis_valid(table) < 0)
goto error;
@@ -536,7 +544,8 @@ static int test_opaque(hid_t fid)
/* Create a new table */
table = H5PTcreate_fl(fid, "Packet Test Dataset3", part_t, (hsize_t)100, -1);
H5Tclose(part_t);
if( H5Tclose(part_t) < 0)
goto error;
if( H5PTis_valid(table) < 0)
goto error;
@@ -743,9 +752,9 @@ static int test_rw_nonnative_dt(hid_t fid)
/* Create a fixed-length packet table within the file */
/* This table's "packets" will be simple integers and it will use no compression */
if(H5Tget_order(H5T_NATIVE_INT) == H5T_ORDER_LE) {
ptable = H5PTcreate_fl(fid, "Packet Test Dataset, Non-native", H5T_STD_I32BE, (hsize_t)100, -1);
ptable = H5PTcreate(fid, "Packet Test Dataset, Non-native", H5T_STD_I32BE, (hsize_t)100, H5P_DEFAULT);
} else {
ptable = H5PTcreate_fl(fid, "Packet Test Dataset, Non-native", H5T_STD_I32LE, (hsize_t)100, -1);
ptable = H5PTcreate(fid, "Packet Test Dataset, Non-native", H5T_STD_I32LE, (hsize_t)100, H5P_DEFAULT);
}
if(ptable == H5I_INVALID_HID)
goto error;
@@ -973,7 +982,8 @@ int main(void)
status = 1;
/* Close the file */
H5Fclose(fid);
if (H5Fclose(fid) < 0)
status = 1;
return status;
}

View File

@@ -28,7 +28,6 @@
#define PT_COMP_VLEN "Dataset with Compound Type of VL types"
#define PT_VLEN_VLEN "Dataset with VL of VL types"
#define PT_FIXED_LEN "Fixed-length Packet Table"
#define SPACE3_RANK 1
#define L1_INCM 16
#define L2_INCM 8
#define NAME_BUF_SIZE 80
@@ -228,7 +227,9 @@ static int test_VLof_comptype(void)
if (ptable == H5I_INVALID_HID)
goto error;
/* Close the vlen datatype */
/* Release the datatypes */
if (H5Tclose(cmptype) < 0)
goto error;
if (H5Tclose(vltype) < 0)
goto error;
@@ -311,13 +312,11 @@ static int test_compound_VL_VLtype(void)
hvl_t v;
} compVLVL_t;
hid_t fid=H5I_INVALID_HID; /* Test file identifier */
hid_t space=H5I_INVALID_HID; /* Dataspace identifier */
hid_t ptable=H5I_INVALID_HID; /* Packet table identifier */
hid_t vlatomic=H5I_INVALID_HID; /* Variable length datatype */
hid_t vlofvl=H5I_INVALID_HID; /* Variable length datatype */
hid_t comp_vlvl=H5I_INVALID_HID; /* ID of a compound datatype containing
a VL of VL of atomic datatype */
hsize_t dims1[] = {NRECORDS};
hsize_t count; /* Number of records in the table */
compVLVL_t writeBuf[NRECORDS];/* Buffer to hold data to be written */
compVLVL_t readBuf[NRECORDS]; /* Buffer to hold read data */
@@ -356,11 +355,6 @@ static int test_compound_VL_VLtype(void)
if (fid < 0)
goto error;
/* Create dataspace for datasets */
space = H5Screate_simple(SPACE3_RANK, dims1, NULL);
if (space < 0)
goto error;
/* Create a VL datatype of an atomic type */
vlatomic = H5Tvlen_create (H5T_NATIVE_UINT);
if (vlatomic < 0)
@@ -394,7 +388,11 @@ static int test_compound_VL_VLtype(void)
if (ptable == H5I_INVALID_HID)
goto error;
/* Close the vlen datatype */
/* Release datatypes */
if (H5Tclose(vlatomic) < 0)
goto error;
if (H5Tclose(vlofvl) < 0)
goto error;
if (H5Tclose(comp_vlvl) < 0)
goto error;
@@ -459,12 +457,6 @@ static int test_compound_VL_VLtype(void)
if (ret < 0)
goto error;
/* Release datatypes */
if (H5Tclose(vlatomic) < 0)
goto error;
if (H5Tclose(vlofvl) < 0)
goto error;
/* Close the file */
if (H5Fclose(fid) < 0)
goto error;
@@ -547,7 +539,9 @@ static int test_VLof_VLtype(void)
if (ptable == H5I_INVALID_HID)
goto error;
/* Close the vlen datatype */
/* Release datatypes */
if (H5Tclose(vlatomic) < 0)
goto error;
if (H5Tclose(vlofvl) < 0)
goto error;
@@ -771,6 +765,10 @@ static int adding_attribute(hid_t fid, const char *table_name, const char *attr_
if (H5Aclose(attr_id) < 0)
goto error;
/* Close the dataspace */
if (H5Sclose(space_id) < 0)
goto error;
/* Close the packet table */
if (H5PTclose(ptable) < 0)
goto error;
@@ -792,19 +790,12 @@ error: /* An error has occurred. Clean up and exit. */
static herr_t verify_attribute(hid_t fid, const char *table_name, const char *attr_name)
{
hid_t ptable=H5I_INVALID_HID; /* Packet table identifier */
hid_t space_id=H5I_INVALID_HID; /* Dataspace for the attribute */
hid_t attr_id=H5I_INVALID_HID; /* Attribute identifier */
hid_t dset_id=H5I_INVALID_HID; /* Dataset associated with the pt */
hsize_t dims[] = {ATTR_DIM}; /* Dimensions for dataspace */
int read_data[ATTR_DIM]; /* Output buffer */
int ii;
herr_t ret = FAIL; /* Returned status from a callee */
/* Create dataspace for attribute */
space_id = H5Screate_simple(ATTR_RANK, dims, NULL);
if (space_id < 0)
goto error;
/* Open the named packet table */
ptable = H5PTopen(fid, table_name);
if (ptable < 0)
@@ -1229,7 +1220,9 @@ static int testfl_VLof_comptype(void)
if (ptable == H5I_INVALID_HID)
goto error;
/* Close the vlen datatype */
/* Release the datatypes */
if (H5Tclose(cmptype) < 0)
goto error;
if (H5Tclose(vltype) < 0)
goto error;
@@ -1312,13 +1305,11 @@ static int testfl_compound_VL_VLtype(void)
hvl_t v;
} compVLVL_t;
hid_t fid=H5I_INVALID_HID; /* Test file identifier */
hid_t space=H5I_INVALID_HID; /* Dataspace identifier */
hid_t ptable=H5I_INVALID_HID; /* Packet table identifier */
hid_t vlatomic=H5I_INVALID_HID; /* Variable length datatype */
hid_t vlofvl=H5I_INVALID_HID; /* Variable length datatype */
hid_t comp_vlvl=H5I_INVALID_HID; /* ID of a compound datatype containing
a VL of VL of atomic datatype */
hsize_t dims1[] = {NRECORDS};
hsize_t count; /* Number of records in the table */
compVLVL_t writeBuf[NRECORDS];/* Buffer to hold data to be written */
compVLVL_t readBuf[NRECORDS]; /* Buffer to hold read data */
@@ -1357,11 +1348,6 @@ static int testfl_compound_VL_VLtype(void)
if (fid < 0)
goto error;
/* Create dataspace for datasets */
space = H5Screate_simple(SPACE3_RANK, dims1, NULL);
if (space < 0)
goto error;
/* Create a VL datatype of an atomic type */
vlatomic = H5Tvlen_create (H5T_NATIVE_UINT);
if (vlatomic < 0)
@@ -1395,7 +1381,11 @@ static int testfl_compound_VL_VLtype(void)
if (ptable == H5I_INVALID_HID)
goto error;
/* Close the vlen datatype */
/* Release datatypes */
if (H5Tclose(vlatomic) < 0)
goto error;
if (H5Tclose(vlofvl) < 0)
goto error;
if (H5Tclose(comp_vlvl) < 0)
goto error;
@@ -1460,12 +1450,6 @@ static int testfl_compound_VL_VLtype(void)
if (ret < 0)
goto error;
/* Release datatypes */
if (H5Tclose(vlatomic) < 0)
goto error;
if (H5Tclose(vlofvl) < 0)
goto error;
/* Close the file */
if (H5Fclose(fid) < 0)
goto error;
@@ -1548,7 +1532,9 @@ static int testfl_VLof_VLtype(void)
if (ptable == H5I_INVALID_HID)
goto error;
/* Close the vlen datatype */
/* Release datatypes */
if (H5Tclose(vlatomic) < 0)
goto error;
if (H5Tclose(vlofvl) < 0)
goto error;
@@ -1654,7 +1640,6 @@ int test_packet_table_with_varlen(void)
if (test_accessors() < 0)
status = FAIL;
/**************************************************************************
Calling test functions for deprecated function H5PTcreate_fl
Mar 2016, -BMR