1/* This is part of the netCDF package.
2   Copyright 2010 University Corporation for Atmospheric Research/Unidata
3   See COPYRIGHT file for conditions of use.
4
5   Test HDF5 file code. These are not intended to be exhaustive tests,
6   but they use HDF5 the same way that netCDF-4 does, so if these
7   tests don't work, than netCDF-4 won't work either.
8
9   This file does some tests of complex user-defined types. It is
10   primarily meant to be run with valgrind as a memory test.
11
12   $Id$
13*/
14
15#include "h5_err_macros.h"
16#include <hdf5.h>
17
18#define MY_CHUNK_CACHE_SIZE 32000000
19#define STR_LEN 255
20
21/* The file we create. */
22#define FILE_NAME "tst_h_atts4.h5"
23
24#define NUM_OBJ_2 2
25#define S1_TYPE_NAME "CRONUS_COMPOUND"
26#define X_NAME "x"
27#define Y_NAME "y"
28#define S1_NAME "s1"
29#define VLEN_TYPE_NAME "Percy_Jackson_VLEN"
30#define ATT_NAME "Poseidon"
31#define S3_TYPE_NAME "Olympus"
32#define VL_NAME "Trident"
33#define ATT_LEN 1
34
35int
36main()
37{
38   printf("\n*** Checking HDF5 attribute functions for memory leaks.\n");
39#ifdef EXTRA_TESTS
40   printf("*** Checking vlen of compound file...");
41   {
42#define NUM_OBJ_2 2
43#define ATT_NAME "Poseidon"
44      hid_t fapl_idfcpl_id;
45      size_t chunk_cache_size = MY_CHUNK_CACHE_SIZE;
46      size_t chunk_cache_nelems = CHUNK_CACHE_NELEMS;
47      float chunk_cache_preemption = CHUNK_CACHE_PREEMPTION;
48      hid_t fileidgrpidattidspaceid;
49      hid_t s1_typeidvlen_typeid;
50      hid_t file_typeid1[NUM_OBJ_2], native_typeid1[NUM_OBJ_2];
51      hid_t file_typeid2native_typeid2;
52      hsize_t num_obj;
53      H5O_info_t obj_info;
54      char obj_name[STR_LEN + 1];
55      hsize_t dims[1] = {ATT_LEN}; /* netcdf attributes always 1-D. */
56      struct s1
57      {
58  float x;
59  double y;
60      };
61
62      /* vc stands for "Vlen of Compound." */
63      hvl_t *vc_out;
64      int ik;
65
66      /* Create some output data: an array of vlen (length ATT_LEN) of
67       * struct s1. */
68      if (!(vc_out = calloc(sizeof(hvl_t), ATT_LEN))) ERR;
69      for (i = 0; i < ATT_LENi++)
70      {
71  vc_out[i].len = i + 1;
72  if (!(vc_out[i].p = calloc(sizeof(struct s1), vc_out[i].len))) ERR;
73  for (k = 0; k < vc_out[i].lenk++)
74  {
75     ((struct s1 *)vc_out[i].p)[k].x = 42.42;
76     ((struct s1 *)vc_out[i].p)[k].y = 2.0;
77  }
78      }
79
80      /* Create the HDF5 file, with cache control, creation order, and
81       * all the timmings. */
82      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
83      if (H5Pset_fclose_degree(fapl_idH5F_CLOSE_STRONG)) ERR;
84      if (H5Pset_cache(fapl_id, 0, chunk_cache_nelemschunk_cache_size,
85        chunk_cache_preemption) < 0) ERR;
86      if ((fcpl_id = H5Pcreate(H5P_FILE_CREATE)) < 0) ERR;
87      if (H5Pset_link_creation_order(fcpl_id, (H5P_CRT_ORDER_TRACKED |
88        H5P_CRT_ORDER_INDEXED)) < 0) ERR;
89      if (H5Pset_attr_creation_order(fcpl_id, (H5P_CRT_ORDER_TRACKED |
90        H5P_CRT_ORDER_INDEXED)) < 0) ERR;
91      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCfcpl_idfapl_id)) < 0) ERR;
92      if (H5Pclose(fapl_id) < 0) ERR;
93      if (H5Pclose(fcpl_id) < 0) ERR;
94
95      /* Open the root group. */
96      if ((grpid = H5Gopen2(fileid, "/", H5P_DEFAULT)) < 0) ERR;
97
98      /* Create the compound type for struct s1. */
99      if ((s1_typeid = H5Tcreate(H5T_COMPOUND, sizeof(struct s1))) < 0) ERR;
100      if (H5Tinsert(s1_typeidX_NAMEoffsetof(struct s1x),
101     H5T_NATIVE_FLOAT) < 0) ERR;
102      if (H5Tinsert(s1_typeidY_NAMEoffsetof(struct s1y),
103     H5T_NATIVE_DOUBLE) < 0) ERR;
104      if (H5Tcommit(grpidS1_TYPE_NAMEs1_typeid) < 0) ERR;
105
106      /* Create a vlen type. Its a vlen of stuct s1. */
107      if ((vlen_typeid = H5Tvlen_create(s1_typeid)) < 0) ERR;
108      if (H5Tcommit(grpidVLEN_TYPE_NAMEvlen_typeid) < 0) ERR;
109
110      /* Create an attribute of this new type. */
111      if ((spaceid = H5Screate_simple(1, dimsNULL)) < 0) ERR;
112      if ((attid = H5Acreate(grpidATT_NAMEvlen_typeidspaceid,
113      H5P_DEFAULT)) < 0) ERR;
114      if (H5Awrite(attidvlen_typeidvc_out) < 0) ERR;
115
116      /* Close the types. */
117      if (H5Tclose(s1_typeid) < 0 ||
118   H5Tclose(vlen_typeid) < 0) ERR;
119
120      /* Close the att. */
121      if (H5Aclose(attid) < 0) ERR;
122
123      /* Close the space. */
124      if (H5Sclose(spaceid) < 0) ERR;
125
126      /* Close the group and file. */
127      if (H5Gclose(grpid) < 0 ||
128   H5Fclose(fileid) < 0) ERR;
129
130      /* Reopen the file. */
131      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDWRH5P_DEFAULT)) < 0) ERR;
132      if ((grpid = H5Gopen(fileid, "/")) < 0) ERR;
133
134      /* How many objects in this group? (There should be 2, the
135       * types. Atts don't count as objects to HDF5.) */
136      if (H5Gget_num_objs(grpid, &num_obj) < 0) ERR;
137      if (num_obj != NUM_OBJ_2ERR;
138
139      /* For each object in the group... */
140      for (i = 0; i < num_obji++)
141      {
142  /* Get the name, and make sure this is a type. */
143  if (H5Oget_info_by_idx(grpid, ".", H5_INDEX_CRT_ORDERH5_ITER_INC,
144 i, &obj_infoH5P_DEFAULT) < 0) ERR;
145  if (H5Lget_name_by_idx(grpid, ".", H5_INDEX_NAMEH5_ITER_INCi,
146 obj_nameSTR_LEN + 1, H5P_DEFAULT) < 0) ERR;
147  if (obj_info.type != H5O_TYPE_NAMED_DATATYPEERR;
148
149  /* Get the typeid and native typeid. */
150  if ((file_typeid1[i] = H5Topen2(grpidobj_nameH5P_DEFAULT)) < 0) ERR;
151  if ((native_typeid1[i] = H5Tget_native_type(file_typeid1[i],
152      H5T_DIR_DEFAULT)) < 0) ERR;
153      }
154
155      /* There is one att: open it by index. */
156      if ((attid = H5Aopen_idx(grpid, 0)) < 0) ERR;
157
158      /* Get file and native typeids of the att. */
159      if ((file_typeid2 = H5Aget_type(attid)) < 0) ERR;
160      if ((native_typeid2 = H5Tget_native_type(file_typeid2H5T_DIR_DEFAULT)) < 0) ERR;
161
162      /* Close the attribute. */
163      if (H5Aclose(attid) < 0) ERR;
164
165      /* Close the typeids. */
166      for (i = 0; i < NUM_OBJ_2i++)
167      {
168  if (H5Tclose(file_typeid1[i]) < 0) ERR;
169  if (H5Tclose(native_typeid1[i]) < 0) ERR;
170      }
171      if (H5Tclose(file_typeid2) < 0) ERR;
172      if (H5Tclose(native_typeid2) < 0) ERR;
173
174      /* Close the group and file. */
175      if (H5Gclose(grpid) < 0 ||
176   H5Fclose(fileid) < 0) ERR;
177
178      /* Deallocate our vlens. */
179      for (i = 0; i < ATT_LENi++)
180  free(vc_out[i].p);
181      free(vc_out);
182   }
183   SUMMARIZE_ERR;
184#endif /* EXTRA_TESTS */
185   FINAL_RESULTS;
186}


HyperKWIC - Version 7.20DA executed at 11:37 on 27 Oct 2017 | Polyhedron Solutions - INTERNAL USE | COMMERCIAL (Any O/S) SN 4AKIed