diff --git a/src/h5core/h5_attach.c b/src/h5core/h5_attach.c index 92f2cea..65d1696 100644 --- a/src/h5core/h5_attach.c +++ b/src/h5core/h5_attach.c @@ -12,6 +12,86 @@ open_space_all ( return H5S_ALL; } +/* + experimental code, will replace h5priv_write_dataset_by_name() somewhen +*/ +write_dataset_by_name ( + h5_file_t* const f, + const hid_t loc_id, + h5_dsetobject_t* dset + ) { + H5_PRIV_API_ENTER (h5_err_t); + h5_info ("Writing dataset %s/%s.", + hdf5_get_objname (loc_id), dset->name); + + h5_err_t exists; + TRY (exists = hdf5_link_exists (loc_id, dsinfo->name)); + if ((exists > 0) && ((f->mode==H5_O_WRONLY) || (f->mode==H5_O_APPEND))) { + h5_warn ("Dataset %s/%s already exist.", + hdf5_get_objname (loc_id), dsinfo->name); + H5_PRIV_API_LEAVE (h5priv_handle_file_mode_error(f->mode)); + } + + /* + open/create dataset + */ + hid_t dset_id; + hid_t dataspace_id; + hid_t diskspace_id; + hid_t memspace_id; + + if (exists) { + /* overwrite dataset */ + TRY (dset_id = hdf5_open_dataset (loc_id, dsinfo->name)); + TRY (dataspace_id = hdf5_get_dataset_space (dset_id)); + TRY (hdf5_set_dataset_extent (dset_id, dsinfo->dims)); + /* exten dataset? */ + } else { + /* create dataset */ + TRY (dataspace_id = hdf5_create_dataspace ( + dsinfo->rank, + dsinfo->dims, + dsinfo->max_dims)); + TRY (dset_id = hdf5_create_dataset ( + loc_id, + dsinfo->name, + dsinfo->type_id, + dataspace_id, + dsinfo->create_prop)); + } + TRY (memspace_id = (*set_memspace)(f, 0)); + TRY (diskspace_id = (*set_diskspace)(f, dataspace_id)); +#ifdef PARALLEL_IO + TRY (h5_start_throttle (f)); +#endif + TRY (hdf5_write_dataset ( + dset_id, + dsinfo->type_id, + memspace_id, + diskspace_id, + f->xfer_prop, + data)); +#ifdef PARALLEL_IO + TRY (h5_end_throttle (f)); +#endif + TRY (hdf5_close_dataspace (diskspace_id)); + TRY (hdf5_close_dataspace (memspace_id)); + TRY (hdf5_close_dataset (dset_id)); + f->empty = 0; + + H5_PRIV_API_RETURN (H5_SUCCESS); +} + +/* + - on all procs create dataset with given size of content + - create diskspace + - set hyperslap on diskspace: + - select all on proc 0 + - select 0 byte on proc > 0 + - create memspace with size of selection + - write + - close objects +*/ h5_err_t h5_write_attachment ( h5_file_t* const f, @@ -23,34 +103,39 @@ h5_write_attachment ( H5_CORE_API_ENTER4 (h5_ssize_t, "name=\"%s\", type=%ld, content=0x%p, size=%llu", name, (long)type, content, (unsigned long long)size); - // write only on proc 0 - if (f->myproc != 0) { - H5_CORE_API_LEAVE (H5_SUCCESS); - } - hid_t group_id; - TRY (group_id = h5priv_open_group (f, f->file, H5_ATTACHMENT)); - h5_err_t exists; - TRY (exists = hdf5_link_exists (group_id, name)); - if (exists > 0) { - // warn user on overwrite - h5_warn ("Dataset %s/%s already exists", - hdf5_get_objname(group_id), name); - } h5_dsinfo_t dsinfo; strncpy (dsinfo.name, name, sizeof (dsinfo.name) - 1); dsinfo.rank = 1; - dsinfo.dims[0] = size; - dsinfo.max_dims[0] = size; dsinfo.type_id = type; dsinfo.create_prop = f->create_prop; dsinfo.access_prop = f->access_prop; + + hid_t group_id; + TRY (group_id = h5priv_open_group (f, f->file, H5_ATTACHMENT)); + + h5_err_t exists; + TRY (exists = hdf5_link_exists (group_id, name)); + // write only on proc 0 + if (f->myproc != 0) { + // write on proc 0 only + dsinfo.dims[0] = size; + dsinfo.max_dims[0] = size; + if (exists > 0) { + h5_warn ("Dataset %s/%s already exists", + hdf5_get_objname(group_id), name); + } + } else { + // write 0 bytes on all other procs + dsinfo.dims[0] = 0; + dsinfo.max_dims[0] = 0; + } TRY (h5priv_write_dataset_by_name ( - f, - group_id, - &dsinfo, - open_space_all, - open_space_all, - content)); + f, + group_id, + &dsinfo, + open_space_all, + open_space_all, + content)); TRY (hdf5_close_group (group_id)); H5_CORE_API_RETURN (H5_SUCCESS); }