From 6b3cf0c1baa2cb447b0b81108f23f55535c47315 Mon Sep 17 00:00:00 2001 From: Nathan Hjelm Date: Wed, 13 Nov 2013 21:02:55 +0000 Subject: [PATCH] Merge branch 'romio_refresh' This commit was SVN r29695. --- ompi/mca/io/romio/configure.m4 | 4 +- ompi/mca/io/romio/romio/.codingcheck | 2 +- ompi/mca/io/romio/romio/.config_params | 2 +- ompi/mca/io/romio/romio/Makefile.am | 171 +- ompi/mca/io/romio/romio/README | 26 +- ompi/mca/io/romio/romio/adio/Makefile.am | 181 -- ompi/mca/io/romio/romio/adio/Makefile.mk | 46 + ompi/mca/io/romio/romio/adio/ad_bg/.gitignore | 11 + .../mca/io/romio/romio/adio/ad_bg/Makefile.mk | 35 + ompi/mca/io/romio/romio/adio/ad_bg/ad_bg.c | 51 + ompi/mca/io/romio/romio/adio/ad_bg/ad_bg.h | 97 + .../io/romio/romio/adio/ad_bg/ad_bg_aggrs.c | 983 +++++++ .../io/romio/romio/adio/ad_bg/ad_bg_aggrs.h | 104 + .../io/romio/romio/adio/ad_bg/ad_bg_close.c | 53 + .../io/romio/romio/adio/ad_bg/ad_bg_fcntl.c | 58 + .../io/romio/romio/adio/ad_bg/ad_bg_flush.c | 90 + .../io/romio/romio/adio/ad_bg/ad_bg_getsh.c | 84 + .../io/romio/romio/adio/ad_bg/ad_bg_hints.c | 542 ++++ .../io/romio/romio/adio/ad_bg/ad_bg_open.c | 307 +++ .../io/romio/romio/adio/ad_bg/ad_bg_pset.c | 279 ++ .../io/romio/romio/adio/ad_bg/ad_bg_pset.h | 81 + .../io/romio/romio/adio/ad_bg/ad_bg_rdcoll.c | 1149 ++++++++ .../io/romio/romio/adio/ad_bg/ad_bg_read.c | 558 ++++ .../io/romio/romio/adio/ad_bg/ad_bg_setsh.c | 68 + .../io/romio/romio/adio/ad_bg/ad_bg_tuning.c | 164 ++ .../io/romio/romio/adio/ad_bg/ad_bg_tuning.h | 96 + .../io/romio/romio/adio/ad_bg/ad_bg_wrcoll.c | 1532 +++++++++++ .../io/romio/romio/adio/ad_bg/ad_bg_write.c | 611 +++++ .../io/romio/romio/adio/ad_bgl/Makefile.am | 42 - .../io/romio/romio/adio/ad_bgl/Makefile.mk | 34 + .../io/romio/romio/adio/ad_bgl/ad_bgl_aggrs.c | 19 +- .../io/romio/romio/adio/ad_bgl/ad_bgl_hints.c | 20 +- .../io/romio/romio/adio/ad_bgl/ad_bgl_open.c | 9 +- .../io/romio/romio/adio/ad_bgl/ad_bgl_pset.h | 4 +- .../romio/romio/adio/ad_bgl/ad_bgl_rdcoll.c | 3 + .../io/romio/romio/adio/ad_bgl/ad_bgl_read.c | 3 + .../romio/romio/adio/ad_bgl/ad_bgl_tuning.c | 23 +- .../romio/romio/adio/ad_bgl/ad_bgl_tuning.h | 1 + .../romio/romio/adio/ad_bgl/ad_bgl_wrcoll.c | 53 +- .../io/romio/romio/adio/ad_bgl/ad_bgl_write.c | 3 + .../romio/adio/ad_bglockless/Makefile.am | 26 - .../romio/adio/ad_bglockless/Makefile.mk | 17 + .../romio/adio/ad_bglockless/ad_bglockless.c | 16 +- .../romio/adio/ad_bglockless/ad_bglockless.h | 2 +- .../romio/romio/adio/ad_gridftp/Makefile.am | 35 - .../romio/romio/adio/ad_gridftp/Makefile.mk | 27 + .../romio/romio/adio/ad_gridftp/ad_gridftp.c | 2 +- .../romio/romio/adio/ad_gridftp/ad_gridftp.h | 2 +- .../romio/adio/ad_gridftp/ad_gridftp_close.c | 2 +- .../romio/adio/ad_gridftp/ad_gridftp_delete.c | 2 +- .../romio/adio/ad_gridftp/ad_gridftp_fcntl.c | 2 +- .../romio/adio/ad_gridftp/ad_gridftp_flush.c | 2 +- .../romio/adio/ad_gridftp/ad_gridftp_hints.c | 2 +- .../romio/adio/ad_gridftp/ad_gridftp_open.c | 2 +- .../romio/adio/ad_gridftp/ad_gridftp_read.c | 2 +- .../romio/adio/ad_gridftp/ad_gridftp_resize.c | 2 +- .../romio/adio/ad_gridftp/ad_gridftp_write.c | 2 +- .../romio/adio/ad_gridftp/globus_routines.c | 2 +- .../io/romio/romio/adio/ad_hfs/Makefile.am | 31 - .../io/romio/romio/adio/ad_hfs/Makefile.mk | 21 + ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs.c | 2 +- ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs.h | 2 +- .../io/romio/romio/adio/ad_hfs/ad_hfs_fcntl.c | 8 +- .../io/romio/romio/adio/ad_hfs/ad_hfs_open.c | 4 +- .../io/romio/romio/adio/ad_hfs/ad_hfs_read.c | 4 +- .../romio/romio/adio/ad_hfs/ad_hfs_resize.c | 4 +- .../io/romio/romio/adio/ad_hfs/ad_hfs_write.c | 4 +- .../io/romio/romio/adio/ad_lustre/Makefile.am | 34 - .../io/romio/romio/adio/ad_lustre/Makefile.mk | 22 + .../io/romio/romio/adio/ad_lustre/ad_lustre.c | 2 +- .../io/romio/romio/adio/ad_lustre/ad_lustre.h | 2 +- .../adio/ad_lustre/ad_lustre_aggregate.c | 2 +- .../romio/adio/ad_lustre/ad_lustre_fcntl.c | 4 +- .../romio/adio/ad_lustre/ad_lustre_hints.c | 2 +- .../romio/adio/ad_lustre/ad_lustre_open.c | 4 +- .../romio/adio/ad_lustre/ad_lustre_rwcontig.c | 2 +- .../romio/adio/ad_lustre/ad_lustre_wrcoll.c | 95 +- .../romio/adio/ad_lustre/ad_lustre_wrstr.c | 5 +- .../io/romio/romio/adio/ad_nfs/Makefile.am | 37 - .../io/romio/romio/adio/ad_nfs/Makefile.mk | 28 + ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs.c | 2 +- ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs.h | 6 +- .../io/romio/romio/adio/ad_nfs/ad_nfs_done.c | 2 +- .../io/romio/romio/adio/ad_nfs/ad_nfs_fcntl.c | 2 +- .../romio/romio/adio/ad_nfs/ad_nfs_features.c | 1 + .../io/romio/romio/adio/ad_nfs/ad_nfs_getsh.c | 5 +- .../io/romio/romio/adio/ad_nfs/ad_nfs_hints.c | 2 +- .../io/romio/romio/adio/ad_nfs/ad_nfs_iread.c | 2 +- .../romio/romio/adio/ad_nfs/ad_nfs_iwrite.c | 2 +- .../io/romio/romio/adio/ad_nfs/ad_nfs_open.c | 15 +- .../io/romio/romio/adio/ad_nfs/ad_nfs_read.c | 5 +- .../romio/romio/adio/ad_nfs/ad_nfs_resize.c | 8 +- .../io/romio/romio/adio/ad_nfs/ad_nfs_setsh.c | 2 +- .../io/romio/romio/adio/ad_nfs/ad_nfs_wait.c | 2 +- .../io/romio/romio/adio/ad_nfs/ad_nfs_write.c | 9 +- .../io/romio/romio/adio/ad_ntfs/Makefile.am | 35 - .../mca/io/romio/romio/adio/ad_ntfs/ad_ntfs.c | 4 +- .../mca/io/romio/romio/adio/ad_ntfs/ad_ntfs.h | 2 +- .../romio/romio/adio/ad_ntfs/ad_ntfs_close.c | 2 +- .../romio/romio/adio/ad_ntfs/ad_ntfs_done.c | 2 +- .../romio/romio/adio/ad_ntfs/ad_ntfs_fcntl.c | 2 +- .../romio/adio/ad_ntfs/ad_ntfs_feature.c | 20 + .../romio/romio/adio/ad_ntfs/ad_ntfs_flush.c | 2 +- .../romio/romio/adio/ad_ntfs/ad_ntfs_iread.c | 2 +- .../romio/romio/adio/ad_ntfs/ad_ntfs_iwrite.c | 2 +- .../romio/romio/adio/ad_ntfs/ad_ntfs_open.c | 2 +- .../romio/romio/adio/ad_ntfs/ad_ntfs_read.c | 2 +- .../romio/romio/adio/ad_ntfs/ad_ntfs_resize.c | 2 +- .../romio/romio/adio/ad_ntfs/ad_ntfs_wait.c | 2 +- .../romio/romio/adio/ad_ntfs/ad_ntfs_write.c | 2 +- .../io/romio/romio/adio/ad_panfs/Makefile.am | 30 - .../io/romio/romio/adio/ad_panfs/Makefile.mk | 25 + .../io/romio/romio/adio/ad_panfs/ad_panfs.c | 2 +- .../io/romio/romio/adio/ad_panfs/ad_panfs.h | 2 +- .../romio/adio/ad_panfs/ad_panfs_hints.c | 4 +- .../romio/romio/adio/ad_panfs/ad_panfs_open.c | 6 +- .../romio/romio/adio/ad_panfs/ad_panfs_read.c | 2 +- .../romio/adio/ad_panfs/ad_panfs_resize.c | 2 +- .../romio/adio/ad_panfs/ad_panfs_write.c | 2 +- .../io/romio/romio/adio/ad_pfs/Makefile.am | 34 - .../io/romio/romio/adio/ad_pfs/Makefile.mk | 26 + ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs.c | 2 +- ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs.h | 2 +- .../io/romio/romio/adio/ad_pfs/ad_pfs_done.c | 2 +- .../io/romio/romio/adio/ad_pfs/ad_pfs_fcntl.c | 2 +- .../io/romio/romio/adio/ad_pfs/ad_pfs_flush.c | 2 +- .../io/romio/romio/adio/ad_pfs/ad_pfs_hints.c | 2 +- .../io/romio/romio/adio/ad_pfs/ad_pfs_iread.c | 2 +- .../romio/romio/adio/ad_pfs/ad_pfs_iwrite.c | 2 +- .../io/romio/romio/adio/ad_pfs/ad_pfs_open.c | 2 +- .../io/romio/romio/adio/ad_pfs/ad_pfs_read.c | 2 +- .../io/romio/romio/adio/ad_pfs/ad_pfs_wait.c | 2 +- .../io/romio/romio/adio/ad_pfs/ad_pfs_write.c | 2 +- .../io/romio/romio/adio/ad_piofs/Makefile.am | 32 - .../io/romio/romio/adio/ad_piofs/Makefile.mk | 21 + .../io/romio/romio/adio/ad_piofs/ad_piofs.c | 2 +- .../io/romio/romio/adio/ad_piofs/ad_piofs.h | 2 +- .../romio/adio/ad_piofs/ad_piofs_fcntl.c | 6 +- .../romio/adio/ad_piofs/ad_piofs_hints.c | 2 +- .../romio/romio/adio/ad_piofs/ad_piofs_open.c | 4 +- .../romio/romio/adio/ad_piofs/ad_piofs_read.c | 4 +- .../romio/adio/ad_piofs/ad_piofs_write.c | 11 +- .../io/romio/romio/adio/ad_pvfs/Makefile.am | 33 - .../io/romio/romio/adio/ad_pvfs/Makefile.mk | 26 + .../mca/io/romio/romio/adio/ad_pvfs/ad_pvfs.c | 2 +- .../mca/io/romio/romio/adio/ad_pvfs/ad_pvfs.h | 2 +- .../romio/romio/adio/ad_pvfs/ad_pvfs_close.c | 2 +- .../romio/romio/adio/ad_pvfs/ad_pvfs_delete.c | 2 +- .../romio/romio/adio/ad_pvfs/ad_pvfs_fcntl.c | 2 +- .../romio/romio/adio/ad_pvfs/ad_pvfs_flush.c | 2 +- .../romio/romio/adio/ad_pvfs/ad_pvfs_hints.c | 2 +- .../romio/romio/adio/ad_pvfs/ad_pvfs_open.c | 2 +- .../romio/romio/adio/ad_pvfs/ad_pvfs_read.c | 5 +- .../romio/romio/adio/ad_pvfs/ad_pvfs_resize.c | 2 +- .../romio/romio/adio/ad_pvfs/ad_pvfs_write.c | 8 +- .../io/romio/romio/adio/ad_pvfs2/Makefile.am | 42 - .../io/romio/romio/adio/ad_pvfs2/Makefile.mk | 32 + .../io/romio/romio/adio/ad_pvfs2/ad_pvfs2.c | 6 +- .../io/romio/romio/adio/ad_pvfs2/ad_pvfs2.h | 2 +- .../romio/romio/adio/ad_pvfs2/ad_pvfs2_aio.c | 2 +- .../romio/adio/ad_pvfs2/ad_pvfs2_close.c | 2 +- .../romio/adio/ad_pvfs2/ad_pvfs2_common.c | 2 +- .../romio/adio/ad_pvfs2/ad_pvfs2_common.h | 2 +- .../romio/adio/ad_pvfs2/ad_pvfs2_delete.c | 2 +- .../romio/adio/ad_pvfs2/ad_pvfs2_fcntl.c | 2 +- .../romio/adio/ad_pvfs2/ad_pvfs2_flush.c | 2 +- .../romio/adio/ad_pvfs2/ad_pvfs2_hints.c | 2 +- .../romio/romio/adio/ad_pvfs2/ad_pvfs2_io.h | 2 +- .../romio/adio/ad_pvfs2/ad_pvfs2_io_dtype.c | 8 +- .../romio/adio/ad_pvfs2/ad_pvfs2_io_list.c | 2 +- .../romio/romio/adio/ad_pvfs2/ad_pvfs2_open.c | 2 +- .../romio/romio/adio/ad_pvfs2/ad_pvfs2_read.c | 2 +- .../ad_pvfs2/ad_pvfs2_read_list_classic.c | 5 +- .../romio/adio/ad_pvfs2/ad_pvfs2_resize.c | 2 +- .../romio/adio/ad_pvfs2/ad_pvfs2_write.c | 2 +- .../ad_pvfs2/ad_pvfs2_write_list_classic.c | 5 +- .../io/romio/romio/adio/ad_sfs/Makefile.am | 29 - .../io/romio/romio/adio/ad_sfs/Makefile.mk | 19 + ompi/mca/io/romio/romio/adio/ad_sfs/ad_sfs.c | 2 +- ompi/mca/io/romio/romio/adio/ad_sfs/ad_sfs.h | 2 +- .../io/romio/romio/adio/ad_sfs/ad_sfs_fcntl.c | 4 +- .../io/romio/romio/adio/ad_sfs/ad_sfs_flush.c | 4 +- .../io/romio/romio/adio/ad_sfs/ad_sfs_open.c | 4 +- .../io/romio/romio/adio/ad_testfs/Makefile.am | 42 - .../io/romio/romio/adio/ad_testfs/Makefile.mk | 32 + .../io/romio/romio/adio/ad_testfs/ad_testfs.c | 2 +- .../io/romio/romio/adio/ad_testfs/ad_testfs.h | 16 +- .../romio/adio/ad_testfs/ad_testfs_close.c | 2 +- .../romio/adio/ad_testfs/ad_testfs_delete.c | 4 +- .../romio/adio/ad_testfs/ad_testfs_done.c | 2 +- .../romio/adio/ad_testfs/ad_testfs_fcntl.c | 2 +- .../romio/adio/ad_testfs/ad_testfs_flush.c | 2 +- .../romio/adio/ad_testfs/ad_testfs_getsh.c | 2 +- .../romio/adio/ad_testfs/ad_testfs_hints.c | 2 +- .../romio/adio/ad_testfs/ad_testfs_iread.c | 2 +- .../romio/adio/ad_testfs/ad_testfs_iwrite.c | 6 +- .../romio/adio/ad_testfs/ad_testfs_open.c | 2 +- .../romio/adio/ad_testfs/ad_testfs_rdcoll.c | 2 +- .../romio/adio/ad_testfs/ad_testfs_read.c | 2 +- .../romio/adio/ad_testfs/ad_testfs_resize.c | 2 +- .../romio/adio/ad_testfs/ad_testfs_seek.c | 2 +- .../romio/adio/ad_testfs/ad_testfs_setsh.c | 2 +- .../romio/adio/ad_testfs/ad_testfs_wait.c | 2 +- .../romio/adio/ad_testfs/ad_testfs_wrcoll.c | 4 +- .../romio/adio/ad_testfs/ad_testfs_write.c | 6 +- .../io/romio/romio/adio/ad_ufs/Makefile.am | 25 - .../io/romio/romio/adio/ad_ufs/Makefile.mk | 17 + ompi/mca/io/romio/romio/adio/ad_ufs/ad_ufs.c | 2 +- ompi/mca/io/romio/romio/adio/ad_ufs/ad_ufs.h | 2 +- .../io/romio/romio/adio/ad_ufs/ad_ufs_open.c | 2 +- .../io/romio/romio/adio/ad_xfs/Makefile.am | 30 - .../io/romio/romio/adio/ad_xfs/Makefile.mk | 22 + ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs.c | 2 +- ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs.h | 2 +- .../io/romio/romio/adio/ad_xfs/ad_xfs_fcntl.c | 2 +- .../io/romio/romio/adio/ad_xfs/ad_xfs_hints.c | 2 +- .../io/romio/romio/adio/ad_xfs/ad_xfs_open.c | 2 +- .../io/romio/romio/adio/ad_xfs/ad_xfs_read.c | 2 +- .../romio/romio/adio/ad_xfs/ad_xfs_resize.c | 2 +- .../io/romio/romio/adio/ad_xfs/ad_xfs_write.c | 2 +- .../io/romio/romio/adio/ad_zoidfs/Makefile.am | 35 - .../io/romio/romio/adio/ad_zoidfs/Makefile.mk | 27 + .../io/romio/romio/adio/ad_zoidfs/ad_zoidfs.c | 2 +- .../io/romio/romio/adio/ad_zoidfs/ad_zoidfs.h | 2 +- .../romio/adio/ad_zoidfs/ad_zoidfs_close.c | 2 +- .../romio/adio/ad_zoidfs/ad_zoidfs_common.c | 2 +- .../romio/adio/ad_zoidfs/ad_zoidfs_common.h | 2 +- .../romio/adio/ad_zoidfs/ad_zoidfs_delete.c | 2 +- .../romio/adio/ad_zoidfs/ad_zoidfs_fcntl.c | 2 +- .../romio/adio/ad_zoidfs/ad_zoidfs_flush.c | 2 +- .../romio/romio/adio/ad_zoidfs/ad_zoidfs_io.c | 2 +- .../romio/adio/ad_zoidfs/ad_zoidfs_open.c | 2 +- .../adio/ad_zoidfs/ad_zoidfs_read_list.c | 5 +- .../romio/adio/ad_zoidfs/ad_zoidfs_resize.c | 2 +- .../adio/ad_zoidfs/ad_zoidfs_write_list.c | 5 +- .../io/romio/romio/adio/common/Makefile.am | 87 - .../io/romio/romio/adio/common/Makefile.mk | 69 + .../io/romio/romio/adio/common/ad_aggregate.c | 2 +- .../romio/adio/common/ad_aggregate_new.c | 2 +- .../mca/io/romio/romio/adio/common/ad_close.c | 2 +- .../romio/adio/common/ad_coll_build_req_new.c | 9 +- .../romio/adio/common/ad_coll_exch_new.c | 19 +- .../io/romio/romio/adio/common/ad_darray.c | 2 +- .../io/romio/romio/adio/common/ad_delete.c | 4 +- ompi/mca/io/romio/romio/adio/common/ad_done.c | 2 +- .../io/romio/romio/adio/common/ad_done_fake.c | 2 +- ompi/mca/io/romio/romio/adio/common/ad_end.c | 9 +- .../mca/io/romio/romio/adio/common/ad_fcntl.c | 2 +- .../io/romio/romio/adio/common/ad_features.c | 1 + .../mca/io/romio/romio/adio/common/ad_flush.c | 2 +- .../io/romio/romio/adio/common/ad_fstype.c | 98 +- .../io/romio/romio/adio/common/ad_get_sh_fp.c | 12 +- .../mca/io/romio/romio/adio/common/ad_hints.c | 26 +- ompi/mca/io/romio/romio/adio/common/ad_init.c | 6 +- .../io/romio/romio/adio/common/ad_io_coll.c | 12 +- .../mca/io/romio/romio/adio/common/ad_iopen.c | 2 +- .../mca/io/romio/romio/adio/common/ad_iread.c | 2 +- .../romio/romio/adio/common/ad_iread_fake.c | 2 +- .../io/romio/romio/adio/common/ad_iwrite.c | 12 +- .../romio/romio/adio/common/ad_iwrite_fake.c | 10 +- ompi/mca/io/romio/romio/adio/common/ad_open.c | 20 +- .../io/romio/romio/adio/common/ad_opencoll.c | 2 +- .../romio/adio/common/ad_opencoll_failsafe.c | 3 +- .../romio/adio/common/ad_opencoll_scalable.c | 2 +- .../io/romio/romio/adio/common/ad_prealloc.c | 2 +- ompi/mca/io/romio/romio/adio/common/ad_read.c | 2 +- .../io/romio/romio/adio/common/ad_read_coll.c | 2 +- .../io/romio/romio/adio/common/ad_read_str.c | 5 +- .../romio/adio/common/ad_read_str_naive.c | 5 +- .../io/romio/romio/adio/common/ad_resize.c | 6 +- ompi/mca/io/romio/romio/adio/common/ad_seek.c | 2 +- .../io/romio/romio/adio/common/ad_set_sh_fp.c | 5 +- .../io/romio/romio/adio/common/ad_set_view.c | 2 +- .../io/romio/romio/adio/common/ad_subarray.c | 2 +- ompi/mca/io/romio/romio/adio/common/ad_wait.c | 2 +- .../io/romio/romio/adio/common/ad_wait_fake.c | 2 +- .../mca/io/romio/romio/adio/common/ad_write.c | 4 +- .../romio/romio/adio/common/ad_write_coll.c | 60 +- .../romio/romio/adio/common/ad_write_nolock.c | 7 +- .../io/romio/romio/adio/common/ad_write_str.c | 7 +- .../romio/adio/common/ad_write_str_naive.c | 7 +- .../io/romio/romio/adio/common/adi_close.c | 7 +- .../io/romio/romio/adio/common/async_list.c | 2 +- .../io/romio/romio/adio/common/byte_offset.c | 2 +- .../romio/romio/adio/common/cb_config_list.c | 14 +- .../io/romio/romio/adio/common/eof_offset.c | 2 +- ompi/mca/io/romio/romio/adio/common/error.c | 65 +- ompi/mca/io/romio/romio/adio/common/flatten.c | 15 +- .../io/romio/romio/adio/common/get_fp_posn.c | 2 +- .../mca/io/romio/romio/adio/common/greq_fns.c | 2 +- .../io/romio/romio/adio/common/heap-sort.c | 2 +- .../mca/io/romio/romio/adio/common/iscontig.c | 15 +- ompi/mca/io/romio/romio/adio/common/lock.c | 4 +- ompi/mca/io/romio/romio/adio/common/malloc.c | 10 +- .../io/romio/romio/adio/common/req_malloc.c | 2 +- .../io/romio/romio/adio/common/shfp_fname.c | 2 +- .../io/romio/romio/adio/common/status_setb.c | 18 +- ompi/mca/io/romio/romio/adio/common/strfns.c | 14 +- .../io/romio/romio/adio/common/system_hints.c | 2 +- .../io/romio/romio/adio/include/Makefile.am | 34 - ompi/mca/io/romio/romio/adio/include/adio.h | 33 +- .../romio/adio/include/adio_cb_config_list.h | 2 +- .../io/romio/romio/adio/include/adio_extern.h | 2 +- ompi/mca/io/romio/romio/adio/include/adioi.h | 95 +- .../romio/romio/adio/include/adioi_errmsg.h | 2 +- .../io/romio/romio/adio/include/adioi_error.h | 59 +- .../romio/romio/adio/include/adioi_fs_proto.h | 2 +- .../io/romio/romio/adio/include/mpio_error.h | 2 +- ompi/mca/io/romio/romio/adio/include/mpipr.h | 4 +- .../romio/adio/include/mpiu_external32.h | 22 + .../io/romio/romio/adio/include/mpiu_greq.h | 2 +- .../io/romio/romio/adio/include/nopackage.h | 16 + .../romio/adio/include/romioconf-undefs.h | 3 + ompi/mca/io/romio/romio/autogen.sh | 5 +- .../romio/romio/confdb/aclocal_attr_alias.m4 | 32 +- ompi/mca/io/romio/romio/confdb/aclocal_cc.m4 | 404 +-- .../io/romio/romio/confdb/aclocal_coverage.m4 | 86 + ompi/mca/io/romio/romio/confdb/aclocal_cxx.m4 | 157 +- ompi/mca/io/romio/romio/confdb/aclocal_f77.m4 | 2327 ++++++++--------- .../io/romio/romio/confdb/aclocal_f77old.m4 | 389 +++ ompi/mca/io/romio/romio/confdb/aclocal_fc.m4 | 359 ++- .../mca/io/romio/romio/confdb/aclocal_libs.m4 | 118 +- ompi/mca/io/romio/romio/confdb/aclocal_mpi.m4 | 109 +- .../io/romio/romio/confdb/aclocal_romio.m4 | 242 +- .../io/romio/romio/confdb/aclocal_runlog.m4 | 188 ++ ompi/mca/io/romio/romio/confdb/aclocal_shl.m4 | 105 +- .../io/romio/romio/confdb/aclocal_subcfg.m4 | 260 +- .../mca/io/romio/romio/confdb/aclocal_util.m4 | 14 +- ompi/mca/io/romio/romio/confdb/ax_tls.m4 | 4 +- ompi/mca/io/romio/romio/configure.ac | 641 +++-- ompi/mca/io/romio/romio/doc/makepubpage.sh | 0 ompi/mca/io/romio/romio/doc/source-guide.tex | 6 +- ompi/mca/io/romio/romio/doc/users-guide.pdf | Bin 157904 -> 105356 bytes ompi/mca/io/romio/romio/doc/users-guide.tex | 20 +- ompi/mca/io/romio/romio/include/Makefile.am | 22 - ompi/mca/io/romio/romio/include/mpio.h.in | 336 ++- ompi/mca/io/romio/romio/mpi-io/Makefile.am | 2 - ompi/mca/io/romio/romio/mpi-io/Makefile.mk | 102 + ompi/mca/io/romio/romio/mpi-io/close.c | 45 +- ompi/mca/io/romio/romio/mpi-io/delete.c | 4 +- ompi/mca/io/romio/romio/mpi-io/file_c2f.c | 6 +- ompi/mca/io/romio/romio/mpi-io/file_f2c.c | 2 +- .../io/romio/romio/mpi-io/fortran/Makefile.in | 222 -- .../io/romio/romio/mpi-io/fortran/Makefile.mk | 68 + .../io/romio/romio/mpi-io/fortran/closef.c | 2 +- .../io/romio/romio/mpi-io/fortran/deletef.c | 2 +- .../io/romio/romio/mpi-io/fortran/fsyncf.c | 2 +- .../romio/romio/mpi-io/fortran/get_amodef.c | 2 +- .../io/romio/romio/mpi-io/fortran/get_atomf.c | 2 +- .../romio/romio/mpi-io/fortran/get_bytofff.c | 2 +- .../io/romio/romio/mpi-io/fortran/get_errhf.c | 2 +- .../romio/romio/mpi-io/fortran/get_extentf.c | 2 +- .../romio/romio/mpi-io/fortran/get_groupf.c | 2 +- .../io/romio/romio/mpi-io/fortran/get_infof.c | 2 +- .../romio/romio/mpi-io/fortran/get_posn_shf.c | 2 +- .../io/romio/romio/mpi-io/fortran/get_posnf.c | 2 +- .../io/romio/romio/mpi-io/fortran/get_sizef.c | 2 +- .../io/romio/romio/mpi-io/fortran/get_viewf.c | 10 +- .../io/romio/romio/mpi-io/fortran/iotestf.c | 2 +- .../io/romio/romio/mpi-io/fortran/iowaitf.c | 2 +- .../io/romio/romio/mpi-io/fortran/iread_atf.c | 2 +- .../io/romio/romio/mpi-io/fortran/iread_shf.c | 2 +- .../io/romio/romio/mpi-io/fortran/ireadf.c | 2 +- .../romio/romio/mpi-io/fortran/iwrite_atf.c | 2 +- .../romio/romio/mpi-io/fortran/iwrite_shf.c | 2 +- .../io/romio/romio/mpi-io/fortran/iwritef.c | 2 +- .../mca/io/romio/romio/mpi-io/fortran/openf.c | 2 +- .../io/romio/romio/mpi-io/fortran/preallocf.c | 2 +- .../romio/romio/mpi-io/fortran/rd_atallbf.c | 2 +- .../romio/romio/mpi-io/fortran/rd_atallef.c | 2 +- .../romio/romio/mpi-io/fortran/read_allbf.c | 2 +- .../romio/romio/mpi-io/fortran/read_allef.c | 2 +- .../io/romio/romio/mpi-io/fortran/read_allf.c | 2 +- .../romio/romio/mpi-io/fortran/read_atallf.c | 2 +- .../io/romio/romio/mpi-io/fortran/read_atf.c | 2 +- .../romio/romio/mpi-io/fortran/read_ordbf.c | 2 +- .../romio/romio/mpi-io/fortran/read_ordef.c | 2 +- .../io/romio/romio/mpi-io/fortran/read_ordf.c | 2 +- .../io/romio/romio/mpi-io/fortran/read_shf.c | 2 +- .../mca/io/romio/romio/mpi-io/fortran/readf.c | 2 +- .../io/romio/romio/mpi-io/fortran/seek_shf.c | 2 +- .../mca/io/romio/romio/mpi-io/fortran/seekf.c | 2 +- .../io/romio/romio/mpi-io/fortran/set_atomf.c | 2 +- .../io/romio/romio/mpi-io/fortran/set_errhf.c | 2 +- .../io/romio/romio/mpi-io/fortran/set_infof.c | 2 +- .../io/romio/romio/mpi-io/fortran/set_sizef.c | 2 +- .../io/romio/romio/mpi-io/fortran/set_viewf.c | 2 +- .../romio/romio/mpi-io/fortran/wr_atallbf.c | 2 +- .../romio/romio/mpi-io/fortran/wr_atallef.c | 2 +- .../romio/romio/mpi-io/fortran/write_allbf.c | 2 +- .../romio/romio/mpi-io/fortran/write_allef.c | 2 +- .../romio/romio/mpi-io/fortran/write_allf.c | 2 +- .../romio/romio/mpi-io/fortran/write_atallf.c | 2 +- .../io/romio/romio/mpi-io/fortran/write_atf.c | 2 +- .../romio/romio/mpi-io/fortran/write_ordbf.c | 2 +- .../romio/romio/mpi-io/fortran/write_ordef.c | 2 +- .../romio/romio/mpi-io/fortran/write_ordf.c | 2 +- .../io/romio/romio/mpi-io/fortran/write_shf.c | 2 +- .../io/romio/romio/mpi-io/fortran/writef.c | 2 +- ompi/mca/io/romio/romio/mpi-io/fsync.c | 21 +- ompi/mca/io/romio/romio/mpi-io/get_amode.c | 12 +- ompi/mca/io/romio/romio/mpi-io/get_atom.c | 12 +- ompi/mca/io/romio/romio/mpi-io/get_bytoff.c | 18 +- ompi/mca/io/romio/romio/mpi-io/get_errh.c | 2 +- ompi/mca/io/romio/romio/mpi-io/get_extent.c | 13 +- ompi/mca/io/romio/romio/mpi-io/get_group.c | 12 +- ompi/mca/io/romio/romio/mpi-io/get_info.c | 14 +- ompi/mca/io/romio/romio/mpi-io/get_posn.c | 14 +- ompi/mca/io/romio/romio/mpi-io/get_posn_sh.c | 20 +- ompi/mca/io/romio/romio/mpi-io/get_size.c | 20 +- ompi/mca/io/romio/romio/mpi-io/get_view.c | 36 +- .../io/romio/romio/mpi-io/glue/Makefile.mk | 10 + .../romio/mpi-io/glue/default/Makefile.in | 52 - .../romio/mpi-io/glue/default/Makefile.mk | 13 + .../romio/mpi-io/glue/default/mpio_err.c | 8 +- .../romio/mpi-io/glue/default/mpio_file.c | 7 +- .../romio/romio/mpi-io/glue/mpich/Makefile.mk | 12 + .../mpi-io/glue/{mpich2 => mpich}/mpio_err.c | 42 +- .../mpi-io/glue/{mpich2 => mpich}/mpio_file.c | 18 +- .../romio/mpi-io/glue/mpich1/Makefile.in | 52 - .../romio/romio/mpi-io/glue/mpich1/mpio_err.c | 65 - .../romio/mpi-io/glue/mpich1/mpio_file.c | 94 - .../romio/mpi-io/glue/mpich2/Makefile.in | 52 - .../romio/mpi-io/glue/openmpi/Makefile.am | 27 - .../romio/mpi-io/glue/openmpi/Makefile.mk | 13 + ompi/mca/io/romio/romio/mpi-io/ioreq_c2f.c | 2 +- ompi/mca/io/romio/romio/mpi-io/ioreq_f2c.c | 2 +- ompi/mca/io/romio/romio/mpi-io/iotest.c | 2 +- ompi/mca/io/romio/romio/mpi-io/iotestall.c | 4 +- ompi/mca/io/romio/romio/mpi-io/iotestany.c | 4 +- ompi/mca/io/romio/romio/mpi-io/iotestsome.c | 2 +- ompi/mca/io/romio/romio/mpi-io/iowait.c | 2 +- ompi/mca/io/romio/romio/mpi-io/iowaitall.c | 4 +- ompi/mca/io/romio/romio/mpi-io/iowaitany.c | 4 +- ompi/mca/io/romio/romio/mpi-io/iowaitsome.c | 2 +- ompi/mca/io/romio/romio/mpi-io/iread.c | 83 +- ompi/mca/io/romio/romio/mpi-io/iread_at.c | 24 +- ompi/mca/io/romio/romio/mpi-io/iread_sh.c | 61 +- ompi/mca/io/romio/romio/mpi-io/iwrite.c | 66 +- ompi/mca/io/romio/romio/mpi-io/iwrite_at.c | 18 +- ompi/mca/io/romio/romio/mpi-io/iwrite_sh.c | 50 +- .../io/romio/romio/mpi-io/mpich_fileutil.c | 60 + ompi/mca/io/romio/romio/mpi-io/mpioimpl.h | 30 +- ompi/mca/io/romio/romio/mpi-io/mpioprof.h | 2 +- .../mca/io/romio/romio/mpi-io/mpir-mpioinit.c | 2 +- .../io/romio/romio/mpi-io/mpiu_external32.c | 163 ++ ompi/mca/io/romio/romio/mpi-io/mpiu_greq.c | 2 +- ompi/mca/io/romio/romio/mpi-io/open.c | 24 +- ompi/mca/io/romio/romio/mpi-io/prealloc.c | 35 +- ompi/mca/io/romio/romio/mpi-io/rd_atallb.c | 8 +- ompi/mca/io/romio/romio/mpi-io/rd_atalle.c | 8 +- ompi/mca/io/romio/romio/mpi-io/read.c | 75 +- ompi/mca/io/romio/romio/mpi-io/read_all.c | 51 +- ompi/mca/io/romio/romio/mpi-io/read_allb.c | 59 +- ompi/mca/io/romio/romio/mpi-io/read_alle.c | 26 +- ompi/mca/io/romio/romio/mpi-io/read_at.c | 12 +- ompi/mca/io/romio/romio/mpi-io/read_atall.c | 12 +- ompi/mca/io/romio/romio/mpi-io/read_ord.c | 40 +- ompi/mca/io/romio/romio/mpi-io/read_ordb.c | 68 +- ompi/mca/io/romio/romio/mpi-io/read_orde.c | 18 +- ompi/mca/io/romio/romio/mpi-io/read_sh.c | 66 +- .../io/romio/romio/mpi-io/register_datarep.c | 61 +- ompi/mca/io/romio/romio/mpi-io/seek.c | 34 +- ompi/mca/io/romio/romio/mpi-io/seek_sh.c | 46 +- ompi/mca/io/romio/romio/mpi-io/set_atom.c | 22 +- ompi/mca/io/romio/romio/mpi-io/set_errh.c | 2 +- ompi/mca/io/romio/romio/mpi-io/set_info.c | 26 +- ompi/mca/io/romio/romio/mpi-io/set_size.c | 34 +- ompi/mca/io/romio/romio/mpi-io/set_view.c | 85 +- ompi/mca/io/romio/romio/mpi-io/wr_atallb.c | 8 +- ompi/mca/io/romio/romio/mpi-io/wr_atalle.c | 8 +- ompi/mca/io/romio/romio/mpi-io/write.c | 65 +- ompi/mca/io/romio/romio/mpi-io/write_all.c | 45 +- ompi/mca/io/romio/romio/mpi-io/write_allb.c | 55 +- ompi/mca/io/romio/romio/mpi-io/write_alle.c | 24 +- ompi/mca/io/romio/romio/mpi-io/write_at.c | 11 +- ompi/mca/io/romio/romio/mpi-io/write_atall.c | 8 +- ompi/mca/io/romio/romio/mpi-io/write_ord.c | 53 +- ompi/mca/io/romio/romio/mpi-io/write_ordb.c | 59 +- ompi/mca/io/romio/romio/mpi-io/write_orde.c | 18 +- ompi/mca/io/romio/romio/mpi-io/write_sh.c | 58 +- .../romio/romio/mpi2-other/array/Makefile.in | 80 - .../io/romio/romio/mpi2-other/array/darray.c | 210 -- .../mpi2-other/array/fortran/Makefile.in | 48 - .../romio/mpi2-other/array/fortran/darrayf.c | 130 - .../mpi2-other/array/fortran/subarrayf.c | 127 - .../romio/romio/mpi2-other/array/subarray.c | 175 -- .../romio/romio/mpi2-other/info/Makefile.in | 105 - .../romio/mpi2-other/info/fortran/Makefile.in | 65 - .../mpi2-other/info/fortran/info_createf.c | 93 - .../mpi2-other/info/fortran/info_deletef.c | 120 - .../romio/mpi2-other/info/fortran/info_dupf.c | 94 - .../mpi2-other/info/fortran/info_freef.c | 95 - .../romio/mpi2-other/info/fortran/info_getf.c | 144 - .../mpi2-other/info/fortran/info_getnksf.c | 93 - .../mpi2-other/info/fortran/info_getnthf.c | 120 - .../mpi2-other/info/fortran/info_getvlnf.c | 120 - .../romio/mpi2-other/info/fortran/info_setf.c | 146 -- .../io/romio/romio/mpi2-other/info/info_c2f.c | 64 - .../romio/romio/mpi2-other/info/info_create.c | 51 - .../romio/romio/mpi2-other/info/info_delete.c | 83 - .../io/romio/romio/mpi2-other/info/info_dup.c | 66 - .../io/romio/romio/mpi2-other/info/info_f2c.c | 49 - .../romio/romio/mpi2-other/info/info_free.c | 56 - .../io/romio/romio/mpi2-other/info/info_get.c | 88 - .../romio/romio/mpi2-other/info/info_getnks.c | 55 - .../romio/romio/mpi2-other/info/info_getnth.c | 74 - .../romio/romio/mpi2-other/info/info_getvln.c | 76 - .../io/romio/romio/mpi2-other/info/info_set.c | 98 - .../io/romio/romio/test-internal/Makefile.am | 26 + .../romio/test-internal/file_realms_test.c | 2 +- .../romio/test-internal/io_bounds_test.c | 2 +- ompi/mca/io/romio/romio/test/Makefile.am | 43 + ompi/mca/io/romio/romio/test/Makefile.in | 58 - ompi/mca/io/romio/romio/test/Mfile.in | 84 + ompi/mca/io/romio/romio/test/aggregation1.c | 2 +- ompi/mca/io/romio/romio/test/aggregation2.c | 2 +- ompi/mca/io/romio/romio/test/async-multiple.c | 2 +- ompi/mca/io/romio/romio/test/async.c | 2 +- ompi/mca/io/romio/romio/test/atomicity.c | 2 +- ompi/mca/io/romio/romio/test/big_extents.c | 2 +- ompi/mca/io/romio/romio/test/coll_perf.c | 2 +- ompi/mca/io/romio/romio/test/coll_test.c | 2 +- ompi/mca/io/romio/romio/test/creat_excl.c | 2 +- ompi/mca/io/romio/romio/test/error.c | 2 +- ompi/mca/io/romio/romio/test/excl.c | 2 +- ompi/mca/io/romio/romio/test/external32.c | 97 + ompi/mca/io/romio/romio/test/file_info.c | 2 +- ompi/mca/io/romio/romio/test/hindexed.c | 3 + ompi/mca/io/romio/romio/test/i_noncontig.c | 2 +- ompi/mca/io/romio/romio/test/large_array.c | 2 +- ompi/mca/io/romio/romio/test/noncontig.c | 2 +- ompi/mca/io/romio/romio/test/noncontig_coll.c | 2 +- .../mca/io/romio/romio/test/noncontig_coll2.c | 2 +- ompi/mca/io/romio/romio/test/ordered_fp.c | 2 +- ompi/mca/io/romio/romio/test/perf.c | 2 +- ompi/mca/io/romio/romio/test/psimple.c | 2 +- ompi/mca/io/romio/romio/test/rtest.in | 131 + ompi/mca/io/romio/romio/test/runtests.in | 3 + ompi/mca/io/romio/romio/test/shared_fp.c | 2 +- ompi/mca/io/romio/romio/test/simple.c | 2 +- ompi/mca/io/romio/romio/test/split_coll.c | 2 +- ompi/mca/io/romio/romio/test/status.c | 2 +- ompi/mca/io/romio/romio/util/nfslock.c | 2 +- ompi/mca/io/romio/src/io_romio_component.c | 2 +- 545 files changed, 13962 insertions(+), 8220 deletions(-) delete mode 100644 ompi/mca/io/romio/romio/adio/Makefile.am create mode 100644 ompi/mca/io/romio/romio/adio/Makefile.mk create mode 100644 ompi/mca/io/romio/romio/adio/ad_bg/.gitignore create mode 100644 ompi/mca/io/romio/romio/adio/ad_bg/Makefile.mk create mode 100644 ompi/mca/io/romio/romio/adio/ad_bg/ad_bg.c create mode 100644 ompi/mca/io/romio/romio/adio/ad_bg/ad_bg.h create mode 100644 ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_aggrs.c create mode 100644 ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_aggrs.h create mode 100644 ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_close.c create mode 100644 ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_fcntl.c create mode 100644 ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_flush.c create mode 100644 ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_getsh.c create mode 100644 ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_hints.c create mode 100644 ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_open.c create mode 100644 ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_pset.c create mode 100644 ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_pset.h create mode 100644 ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_rdcoll.c create mode 100644 ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_read.c create mode 100644 ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_setsh.c create mode 100644 ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_tuning.c create mode 100644 ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_tuning.h create mode 100644 ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_wrcoll.c create mode 100644 ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_write.c delete mode 100644 ompi/mca/io/romio/romio/adio/ad_bgl/Makefile.am create mode 100644 ompi/mca/io/romio/romio/adio/ad_bgl/Makefile.mk delete mode 100644 ompi/mca/io/romio/romio/adio/ad_bglockless/Makefile.am create mode 100644 ompi/mca/io/romio/romio/adio/ad_bglockless/Makefile.mk delete mode 100644 ompi/mca/io/romio/romio/adio/ad_gridftp/Makefile.am create mode 100644 ompi/mca/io/romio/romio/adio/ad_gridftp/Makefile.mk delete mode 100644 ompi/mca/io/romio/romio/adio/ad_hfs/Makefile.am create mode 100644 ompi/mca/io/romio/romio/adio/ad_hfs/Makefile.mk delete mode 100644 ompi/mca/io/romio/romio/adio/ad_lustre/Makefile.am create mode 100644 ompi/mca/io/romio/romio/adio/ad_lustre/Makefile.mk delete mode 100644 ompi/mca/io/romio/romio/adio/ad_nfs/Makefile.am create mode 100644 ompi/mca/io/romio/romio/adio/ad_nfs/Makefile.mk delete mode 100644 ompi/mca/io/romio/romio/adio/ad_ntfs/Makefile.am create mode 100644 ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_feature.c delete mode 100644 ompi/mca/io/romio/romio/adio/ad_panfs/Makefile.am create mode 100644 ompi/mca/io/romio/romio/adio/ad_panfs/Makefile.mk delete mode 100644 ompi/mca/io/romio/romio/adio/ad_pfs/Makefile.am create mode 100644 ompi/mca/io/romio/romio/adio/ad_pfs/Makefile.mk delete mode 100644 ompi/mca/io/romio/romio/adio/ad_piofs/Makefile.am create mode 100644 ompi/mca/io/romio/romio/adio/ad_piofs/Makefile.mk delete mode 100644 ompi/mca/io/romio/romio/adio/ad_pvfs/Makefile.am create mode 100644 ompi/mca/io/romio/romio/adio/ad_pvfs/Makefile.mk delete mode 100644 ompi/mca/io/romio/romio/adio/ad_pvfs2/Makefile.am create mode 100644 ompi/mca/io/romio/romio/adio/ad_pvfs2/Makefile.mk delete mode 100644 ompi/mca/io/romio/romio/adio/ad_sfs/Makefile.am create mode 100644 ompi/mca/io/romio/romio/adio/ad_sfs/Makefile.mk delete mode 100644 ompi/mca/io/romio/romio/adio/ad_testfs/Makefile.am create mode 100644 ompi/mca/io/romio/romio/adio/ad_testfs/Makefile.mk delete mode 100644 ompi/mca/io/romio/romio/adio/ad_ufs/Makefile.am create mode 100644 ompi/mca/io/romio/romio/adio/ad_ufs/Makefile.mk delete mode 100644 ompi/mca/io/romio/romio/adio/ad_xfs/Makefile.am create mode 100644 ompi/mca/io/romio/romio/adio/ad_xfs/Makefile.mk delete mode 100644 ompi/mca/io/romio/romio/adio/ad_zoidfs/Makefile.am create mode 100644 ompi/mca/io/romio/romio/adio/ad_zoidfs/Makefile.mk delete mode 100644 ompi/mca/io/romio/romio/adio/common/Makefile.am create mode 100644 ompi/mca/io/romio/romio/adio/common/Makefile.mk delete mode 100644 ompi/mca/io/romio/romio/adio/include/Makefile.am create mode 100644 ompi/mca/io/romio/romio/adio/include/mpiu_external32.h create mode 100644 ompi/mca/io/romio/romio/adio/include/nopackage.h create mode 100644 ompi/mca/io/romio/romio/confdb/aclocal_coverage.m4 create mode 100644 ompi/mca/io/romio/romio/confdb/aclocal_f77old.m4 mode change 100644 => 100755 ompi/mca/io/romio/romio/doc/makepubpage.sh delete mode 100644 ompi/mca/io/romio/romio/include/Makefile.am create mode 100644 ompi/mca/io/romio/romio/mpi-io/Makefile.mk delete mode 100644 ompi/mca/io/romio/romio/mpi-io/fortran/Makefile.in create mode 100644 ompi/mca/io/romio/romio/mpi-io/fortran/Makefile.mk create mode 100644 ompi/mca/io/romio/romio/mpi-io/glue/Makefile.mk delete mode 100644 ompi/mca/io/romio/romio/mpi-io/glue/default/Makefile.in create mode 100644 ompi/mca/io/romio/romio/mpi-io/glue/default/Makefile.mk create mode 100644 ompi/mca/io/romio/romio/mpi-io/glue/mpich/Makefile.mk rename ompi/mca/io/romio/romio/mpi-io/glue/{mpich2 => mpich}/mpio_err.c (72%) rename ompi/mca/io/romio/romio/mpi-io/glue/{mpich2 => mpich}/mpio_file.c (84%) delete mode 100644 ompi/mca/io/romio/romio/mpi-io/glue/mpich1/Makefile.in delete mode 100644 ompi/mca/io/romio/romio/mpi-io/glue/mpich1/mpio_err.c delete mode 100644 ompi/mca/io/romio/romio/mpi-io/glue/mpich1/mpio_file.c delete mode 100644 ompi/mca/io/romio/romio/mpi-io/glue/mpich2/Makefile.in delete mode 100644 ompi/mca/io/romio/romio/mpi-io/glue/openmpi/Makefile.am create mode 100644 ompi/mca/io/romio/romio/mpi-io/glue/openmpi/Makefile.mk create mode 100644 ompi/mca/io/romio/romio/mpi-io/mpich_fileutil.c create mode 100644 ompi/mca/io/romio/romio/mpi-io/mpiu_external32.c delete mode 100644 ompi/mca/io/romio/romio/mpi2-other/array/Makefile.in delete mode 100644 ompi/mca/io/romio/romio/mpi2-other/array/darray.c delete mode 100644 ompi/mca/io/romio/romio/mpi2-other/array/fortran/Makefile.in delete mode 100644 ompi/mca/io/romio/romio/mpi2-other/array/fortran/darrayf.c delete mode 100644 ompi/mca/io/romio/romio/mpi2-other/array/fortran/subarrayf.c delete mode 100644 ompi/mca/io/romio/romio/mpi2-other/array/subarray.c delete mode 100644 ompi/mca/io/romio/romio/mpi2-other/info/Makefile.in delete mode 100644 ompi/mca/io/romio/romio/mpi2-other/info/fortran/Makefile.in delete mode 100644 ompi/mca/io/romio/romio/mpi2-other/info/fortran/info_createf.c delete mode 100644 ompi/mca/io/romio/romio/mpi2-other/info/fortran/info_deletef.c delete mode 100644 ompi/mca/io/romio/romio/mpi2-other/info/fortran/info_dupf.c delete mode 100644 ompi/mca/io/romio/romio/mpi2-other/info/fortran/info_freef.c delete mode 100644 ompi/mca/io/romio/romio/mpi2-other/info/fortran/info_getf.c delete mode 100644 ompi/mca/io/romio/romio/mpi2-other/info/fortran/info_getnksf.c delete mode 100644 ompi/mca/io/romio/romio/mpi2-other/info/fortran/info_getnthf.c delete mode 100644 ompi/mca/io/romio/romio/mpi2-other/info/fortran/info_getvlnf.c delete mode 100644 ompi/mca/io/romio/romio/mpi2-other/info/fortran/info_setf.c delete mode 100644 ompi/mca/io/romio/romio/mpi2-other/info/info_c2f.c delete mode 100644 ompi/mca/io/romio/romio/mpi2-other/info/info_create.c delete mode 100644 ompi/mca/io/romio/romio/mpi2-other/info/info_delete.c delete mode 100644 ompi/mca/io/romio/romio/mpi2-other/info/info_dup.c delete mode 100644 ompi/mca/io/romio/romio/mpi2-other/info/info_f2c.c delete mode 100644 ompi/mca/io/romio/romio/mpi2-other/info/info_free.c delete mode 100644 ompi/mca/io/romio/romio/mpi2-other/info/info_get.c delete mode 100644 ompi/mca/io/romio/romio/mpi2-other/info/info_getnks.c delete mode 100644 ompi/mca/io/romio/romio/mpi2-other/info/info_getnth.c delete mode 100644 ompi/mca/io/romio/romio/mpi2-other/info/info_getvln.c delete mode 100644 ompi/mca/io/romio/romio/mpi2-other/info/info_set.c create mode 100644 ompi/mca/io/romio/romio/test-internal/Makefile.am create mode 100644 ompi/mca/io/romio/romio/test/Makefile.am delete mode 100644 ompi/mca/io/romio/romio/test/Makefile.in create mode 100644 ompi/mca/io/romio/romio/test/Mfile.in create mode 100644 ompi/mca/io/romio/romio/test/external32.c create mode 100644 ompi/mca/io/romio/romio/test/rtest.in diff --git a/ompi/mca/io/romio/configure.m4 b/ompi/mca/io/romio/configure.m4 index ae2736113b..f754e34e68 100644 --- a/ompi/mca/io/romio/configure.m4 +++ b/ompi/mca/io/romio/configure.m4 @@ -78,10 +78,10 @@ AC_DEFUN([MCA_ompi_io_romio_CONFIG],[ [AS_IF([test ! -z $build], [io_romio_flags="$io_romio_flags --build=$build"]) AS_IF([test ! -z $host], [io_romio_flags="$io_romio_flags --host=$host"]) AS_IF([test ! -z $target], [io_romio_flags="$io_romio_flags --target=$target"])]) - io_romio_flags_define="$io_romio_flags CFLAGS='$CFLAGS' CPPFLAGS='$CPPFLAGS' FFLAGS='$FFLAGS' LDFLAGS='$LDFLAGS' --$io_romio_shared-shared --$io_romio_static-static $io_romio_flags $io_romio_prefix_arg --with-mpi=open_mpi --disable-aio" + io_romio_flags_define="$io_romio_flags FROM_OMPI=yes CC='$CC' CFLAGS='$CFLAGS' CPPFLAGS='$CPPFLAGS' FFLAGS='$FFLAGS' LDFLAGS='$LDFLAGS' --$io_romio_shared-shared --$io_romio_static-static $io_romio_flags $io_romio_prefix_arg --with-mpi=$(top_srcdir)/ompi --disable-aio" AC_DEFINE_UNQUOTED([MCA_io_romio_COMPLETE_CONFIGURE_FLAGS], ["$io_romio_flags_define"], [Complete set of command line arguments given to ROMIOs configure script]) - io_romio_flags="$io_romio_flags CFLAGS="'"'"$CFLAGS"'"'" CPPFLAGS="'"'"$CPPFLAGS"'"'" FFLAGS="'"'"$FFLAGS"'"'" LDFLAGS="'"'"$LDFLAGS"'"'" --$io_romio_shared-shared --$io_romio_static-static $io_romio_flags $io_romio_prefix_arg --with-mpi=open_mpi --disable-aio" + io_romio_flags="$io_romio_flags FROM_OMPI=yes CC="'"'"$CC"'"'" CFLAGS="'"'"$CFLAGS"'"'" CPPFLAGS="'"'"$CPPFLAGS"'"'" FFLAGS="'"'"$FFLAGS"'"'" LDFLAGS="'"'"$LDFLAGS"'"'" --$io_romio_shared-shared --$io_romio_static-static $io_romio_flags $io_romio_prefix_arg --with-mpi=$(top_srcdir) --disable-aio" ompi_show_subtitle "Configuring ROMIO distribution" OMPI_CONFIG_SUBDIR([ompi/mca/io/romio/romio], diff --git a/ompi/mca/io/romio/romio/.codingcheck b/ompi/mca/io/romio/romio/.codingcheck index 68d13c4815..9b52b35ce4 100644 --- a/ompi/mca/io/romio/romio/.codingcheck +++ b/ompi/mca/io/romio/romio/.codingcheck @@ -39,7 +39,7 @@ 'PFS'=> romio, 'PIOFS'=> romio, 'MPICH'=> romio, - 'MPICH2' => romio, + 'MPICH' => romio, 'MPI_OFFSET_IS_INT'=> romio, 'MPI_COMBINER_NAMED'=> romio, '_UNICOS'=> romio, diff --git a/ompi/mca/io/romio/romio/.config_params b/ompi/mca/io/romio/romio/.config_params index 07ac7a9c00..fcc2f9146d 100644 --- a/ompi/mca/io/romio/romio/.config_params +++ b/ompi/mca/io/romio/romio/.config_params @@ -21,6 +21,7 @@ __netbsd_ __LINUX_ __LINUX_ALPHA_ __CRAY_ +__Darwin_ __nfs_ __ufs_ __pfs_ @@ -35,5 +36,4 @@ __sgi_mpi __hp_mpi __cray_mpi __lam_mpi -__Darwin __open_mpi diff --git a/ompi/mca/io/romio/romio/Makefile.am b/ompi/mca/io/romio/romio/Makefile.am index 738ec14275..158a41e2a5 100644 --- a/ompi/mca/io/romio/romio/Makefile.am +++ b/ompi/mca/io/romio/romio/Makefile.am @@ -1,4 +1,4 @@ -# +# -*- Mode: Makefile; -*- # Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana # University Research and Technology # Corporation. All rights reserved. @@ -16,23 +16,164 @@ # # $HEADER$ # +# (C) 2011 by Argonne National Laboratory. +# See COPYRIGHT in top-level directory. +# +# OMPI: include a top level makefile with some options include $(top_srcdir)/Makefile.options -# Left out common/dataloop -- it's not enabled in MPICH2-1.0.7. +## TODO: need to write an automakefile that handles two primary cases: +## 1) that ROMIO is being embedded within the MPI library, as in MPICH or Open +## MPI +## 2) that ROMIO is being built standalone, old-school style. This case is +## basically unused in modern practice. -SUBDIRS = include adio mpi-io -DIST_SUBDIRS = $(SUBDIRS) doc util +# help autoreconf and friends realize where the macros live +ACLOCAL_AMFLAGS = -I confdb -EXTRA_DIST = README COPYRIGHT README_OMPI autogen.sh +# empty variable initializations so that later code can append (+=) +include_HEADERS = +nodist_include_HEADERS = +noinst_HEADERS = +EXTRA_DIST = +SUFFIXES = +doc1_src_txt = + +# ------------------------------------------------------------------------ +# variables to be populated by the included Makefile.mk fragments: + +# These are files that contain MPI routines (e.g., MPI_File_open). +# In MPICH these will have an MPI_ and a PMPI_ version. Other implementations +# (like OMPI) only want these to be MPI_ routines, possibly with some +# name-shifting prefix. +romio_mpi_sources = + +# regular old source files that implement ROMIO, such as ADIO code +romio_other_sources = + +# code that may need to be "up" called from the MPI library and/or is +# MPI-implementation-specific in some way +glue_sources = + +# ------------------------------------------------------------------------ +# when building under MPICH we must be able to find mpi.h +AM_CPPFLAGS += $(MPI_H_INCLUDE) + +# ------------------------------------------------------------------------ +# handle the "include" directory here +AM_CPPFLAGS += -I$(top_builddir)/include -I$(top_srcdir)/include +# nodist_ b/c these are created by config.status and should not be distributed +nodist_include_HEADERS += include/mpio.h +noinst_HEADERS += include/io_romio_conv.h + +# ------------------------------------------------------------------------ + +SUBDIRS = +DIST_SUBDIRS = test test-internal + +# for the sake of parallel make and avoiding an excessive number of convenience +# libs, we use a subdir automake fragment strategy +include mpi-io/Makefile.mk +include adio/Makefile.mk + +EXTRA_DIST += autogen.sh + +if BUILD_ROMIO_EMBEDDED +# Build a libtool convenience library that the enclosing MPI implementation can +# use by adding it to the right _LIBADD variable. +noinst_LTLIBRARIES = libromio_dist.la +libromio_dist_la_SOURCES = $(romio_mpi_sources) $(romio_other_sources) $(glue_sources) + +## NOTE: ROMIO's old build system builds a bunch of _foo.o objects that contain +## PMPI_ implementations as well as calls to only other PMPI routines. In +## MPICH, these are the objects that need to go into libmpich, while the foo.o +## objects should go into libpmpich. Furthermore, the -D option for ROMIO's +## source files is different and inverted (in the boolean sense) compared with +## MPICH's defintion. And ROMIO was dumping all of the symbols into the main +## libmpich library, regardless of the separate profiling library's existence. +## +## Annoying, right? +if BUILD_PROFILING_LIB +# The current best strategy for now is to build the PMPI symbols as a separate +# convenience lib to permit adding the special "-D..." argument for all objects. +# MPICH will then link in both convenience library into libmpich, since it +# won't work very well the other way around. +noinst_LTLIBRARIES += libpromio.la +libpromio_la_SOURCES = $(romio_mpi_sources) +libpromio_la_CPPFLAGS = $(AM_CPPFLAGS) -DMPIO_BUILD_PROFILING +endif BUILD_PROFILING_LIB + +else !BUILD_ROMIO_EMBEDDED +## TODO build a libromio.la (non-convenience) and possibly a libglue.la or something? + +endif + +# -------------------------------------------------------------------------- +.PHONY: coverage +gcov_sources = $(libmpl_la_SOURCES) +# assumes that these sources were compiled appropriately ("-fprofile-arcs" +# and "-ftest-coverage") +coverage: + @for file in $(gcov_sources) ; do \ + dir=`dirname $$file` ; \ + bname=`basename $$file` ; \ + aux=`echo $$bname | sed -e 's,\.*$$,,'` ; \ + echo "( $(GCOV) -b -f -o $$file $$file && mv $${bname}.gcov $$dir )" ; \ + ( $(GCOV) -b -f -o $$file $$file && mv $${bname}.gcov $$dir ) ; \ + rm -f *.gcov ; \ + done + for subdir in $(SUBDIRS) - ; do \ + if test $$subdir = "-" ; then break ; fi ; \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) coverage ) ; \ + done +# -------------------------------------------------------------------------- +.PHONY: mandoc mandoc-local htmldoc htmldoc-local +SUFFIXES += .man-phony .html-phony .man1-phony .html1-phony .txt + +# "make V=1" support for our documentation recipes +doctextman_verbose = $(doctextman_verbose_$(V)) +doctextman_verbose_ = $(doctextman_verbose_$(AM_DEFAULT_VERBOSITY)) +doctextman_verbose_0 = @echo " DOCTEXTMAN " $@; +doctexthtml_verbose = $(doctexthtml_verbose_$(V)) +doctexthtml_verbose_ = $(doctexthtml_verbose_$(AM_DEFAULT_VERBOSITY)) +doctexthtml_verbose_0 = @echo " DOCTEXTHTML " $@; + +# Build dir paths where the man pages will be created. Will usually be +# overridden by MPICH make. +mandoc_path1=$(abs_top_builddir)/man/man1 +mandoc_path3=$(abs_top_builddir)/man/man3 +htmldoc_path1=$(abs_top_builddir)/www/www1 +htmldoc_path3=$(abs_top_builddir)/www/www3 +doctext_docnotes= + +.c.man-phony: + $(doctextman_verbose)$(DOCTEXT) -man -mpath $(mandoc_path3) -ext 3 \ + -heading MPI -quotefmt $(doctext_docnotes) $< +.c.html-phony: + $(doctexthtml_verbose)$(DOCTEXT) -html -mpath $(htmldoc_path3) \ + -heading MPI -quotefmt $(doctext_docnotes) $< + +.txt.man1-phony: + $(doctextman_verbose)$(DOCTEXT) -man -mpath $(mandoc_path1) -ext 1 \ + -heading MPI -quotefmt $(doctext_docnotes) $< +.txt.html1-phony: + $(doctexthtml_verbose)$(DOCTEXT) -html -mpath $(htmldoc_path1) \ + -heading MPI -quotefmt $(doctext_docnotes) $< + +# use mandoc-local target to force directory creation before running DOCTEXT +mandoc: + test -d $(mandoc_path1) || $(MKDIR_P) $(mandoc_path1) + test -d $(mandoc_path3) || $(MKDIR_P) $(mandoc_path3) + $(MAKE) $(AM_MAKEFLAGS) mandoc-local +mandoc-local: $(romio_mpi_sources:.c=.man-phony) $(doc1_src_txt:.txt=.man1-phony) + +# use htmldoc-local target to force directory creation before running DOCTEXT +htmldoc: + test -d $(top_builddir)/www/www1 || $(MKDIR_P) $(top_builddir)/www/www1 + test -d $(top_builddir)/www/www3 || $(MKDIR_P) $(top_builddir)/www/www3 + $(MAKE) $(AM_MAKEFLAGS) htmldoc-local +htmldoc-local: $(romio_mpi_sources:.c=.html-phony) $(doc1_src_txt:.txt=.html1-phony) + +# -------------------------------------------------------------------------- -noinst_LTLIBRARIES = libromio_dist.la -libromio_dist_la_SOURCES = -libromio_dist_la_LIBADD = \ - adio/libadio.la \ - mpi-io/libmpi-io.la \ - mpi-io/glue/openmpi/libglue.la @ROMIO_LIBLIST@ -libromio_dist_la_DEPENDENCIES = \ - adio/libadio.la \ - mpi-io/libmpi-io.la \ - mpi-io/glue/openmpi/libglue.la diff --git a/ompi/mca/io/romio/romio/README b/ompi/mca/io/romio/romio/README index 42fe329a9f..35886ce674 100644 --- a/ompi/mca/io/romio/romio/README +++ b/ompi/mca/io/romio/romio/README @@ -5,13 +5,13 @@ Major Changes in this version: ------------------------------ * Fixed performance problems with the darray and subarray datatypes - when using MPICH2. + when using MPICH. -* Better support for building against existing MPICH and MPICH2 versions. +* Better support for building against existing MPICH and MPICH versions. When building against an existing MPICH installation, use the - "--with-mpi=mpich" option to ROMIO configure. For MPICH2, use the - "--with-mpi=mpich2" option. These will allow ROMIO to take advantage + "--with-mpi=mpich" option to ROMIO configure. For MPICH, use the + "--with-mpi=mpich" option. These will allow ROMIO to take advantage of internal features of these implementations. * Deprecation of SFS, HFS, and PIOFS implementations. @@ -161,9 +161,9 @@ Major Changes in Version 1.0.3: Major Changes Version 1.0.2: --------------------------- -* Implemented the shared file pointer functions (Section 9.4.4 of MPI-2) and - split collective I/O functions (Section 9.4.5). Therefore, the main - components of the MPI-2 I/O chapter not yet implemented are +* Implemented the shared file pointer functions and + split collective I/O functions. Therefore, the main + components of the MPI I/O chapter not yet implemented are file interoperability and error handling. * Added support for using "direct I/O" on SGI's XFS file system. @@ -298,13 +298,13 @@ General Information ------------------- ROMIO is a high-performance, portable implementation of MPI-IO (the -I/O chapter in MPI-2). ROMIO's home page is at -http://www.mcs.anl.gov/romio . The MPI-2 standard is available at +I/O chapter in MPI). ROMIO's home page is at +http://www.mcs.anl.gov/romio . The MPI standard is available at http://www.mpi-forum.org/docs/docs.html . -This version of ROMIO includes everything defined in the MPI-2 I/O -chapter except support for file interoperability (Sec. 9.5 of MPI-2) and -user-defined error handlers for files (Sec. 4.13.3). The subarray and +This version of ROMIO includes everything defined in the MPI I/O +chapter except support for file interoperability and +user-defined error handlers for files. The subarray and distributed array datatype constructor functions from Chapter 4 (Sec. 4.14.4 & 4.14.5) have been implemented. They are useful for accessing arrays stored in files. The functions MPI_File_f2c and @@ -587,7 +587,7 @@ Use a larger number if you still get the error message. * If a Fortran program uses a file handle created using ROMIO's C interface, or vice-versa, you must use the functions MPI_File_c2f -or MPI_File_f2c (see MPI-2 Section 4.12.4). Such a situation occurs, +or MPI_File_f2c. Such a situation occurs, for example, if a Fortran program uses an I/O library written in C with MPI-IO calls. Similar functions MPIO_Request_f2c and MPIO_Request_c2f are also provided. diff --git a/ompi/mca/io/romio/romio/adio/Makefile.am b/ompi/mca/io/romio/romio/adio/Makefile.am deleted file mode 100644 index 048861ca76..0000000000 --- a/ompi/mca/io/romio/romio/adio/Makefile.am +++ /dev/null @@ -1,181 +0,0 @@ -# -# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana -# University Research and Technology -# Corporation. All rights reserved. -# Copyright (c) 2004-2005 The University of Tennessee and The University -# of Tennessee Research Foundation. All rights -# reserved. -# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, -# University of Stuttgart. All rights reserved. -# Copyright (c) 2004-2005 The Regents of the University of California. -# All rights reserved. -# Copyright (c) 2008 Cisco Systems, Inc. All rights reserved. -# $COPYRIGHT$ -# -# Additional copyrights may follow -# -# $HEADER$ -# - -include $(top_srcdir)/Makefile.options - -# Conditionals whether to build each subdir or not - -if BUILD_BGL -BGL_DIR = ad_bgl -BGL_LIB = ad_bgl/libadio_bgl.la -else -BGL_DIR = -BGL_LIB = -endif - -if BUILD_BGLOCKLESS -BGLOCKLESS_DIR = ad_bglockless -BGLOCKLESS_LIB = ad_bglockless/libadio_bglockless.la -else -BGLOCKLESS_DIR = -BGLOCKLESS_LIB = -endif - -if BUILD_GRIDFTP -GRIDFTP_DIR = ad_gridftp -GRIDFTP_LIB = ad_gridftp/libadio_gridftp.la -else -GRIDFTP_DIR = -GRIDFTP_LIB = -endif - -# 8 July 2008: romio-maint@mcs.anl.gov says that this is deprecated -#if BUILD_HFS -#HFS_DIR = ad_hfs -#HFS_LIB = ad_hfs/libadio_hfs.la -#else -#HFS_DIR = -#HFS_LIB = -#endif - -if BUILD_LUSTRE -LUSTRE_DIR = ad_lustre -LUSTRE_LIB = ad_lustre/libadio_lustre.la -else -LUSTRE_DIR = -LUSTRE_LIB = -endif - -if BUILD_NFS -NFS_DIR = ad_nfs -NFS_LIB = ad_nfs/libadio_nfs.la -else -NFS_DIR = -NFS_LIB = -endif - -# Currently disabled -#if BUILD_NTFS -#NTFS_DIR = ad_ntfs -#NTFS_LIB = ad_ntfs/libadio_ntfs.la -#else -#NTFS_DIR = -#NTFS_LIB = -#endif - -if BUILD_PANFS -PANFS_DIR = ad_panfs -PANFS_LIB = ad_panfs/libadio_panfs.la -else -PANFS_DIR = -PANFS_LIB = -endif - -if BUILD_PFS -PFS_DIR = ad_pfs -PFS_LIB = ad_pfs/libadio_pfs.la -else -PFS_DIR = -PFS_LIB = -endif - -# 8 July 2008: romio-maint@mcs.anl.gov says that this is deprecated -#if BUILD_PIOFS -#PIOFS_DIR = ad_piofs -#PIOFS_LIB = ad_piofs/libadio_piofs.la -#else -#PIOFS_DIR = -#PIOFS_LIB = -#endif - -if BUILD_PVFS -PVFS_DIR = ad_pvfs -PVFS_LIB = ad_pvfs/libadio_pvfs.la -else -PVFS_DIR = -PVFS_LIB = -endif - -if BUILD_PVFS2 -PVFS2_DIR = ad_pvfs2 -PVFS2_LIB = ad_pvfs2/libadio_pvfs2.la -else -PVFS2_DIR = -PVFS2_LIB = -endif - -if BUILD_SFS -SFS_DIR = ad_sfs -SFS_LIB = ad_sfs/libadio_sfs.la -else -SFS_DIR = -SFS_LIB = -endif - -if BUILD_TESTFS -TESTFS_DIR = ad_testfs -TESTFS_LIB = ad_testfs/libadio_testfs.la -else -TESTFS_DIR = -TESTFS_LIB = -endif - -if BUILD_UFS -UFS_DIR = ad_ufs -UFS_LIB = ad_ufs/libadio_ufs.la -else -UFS_DIR = -UFS_LIB = -endif - -if BUILD_XFS -XFS_DIR = ad_xfs -XFS_LIB = ad_xfs/libadio_xfs.la -else -XFS_DIR = -XFS_LIB = -endif - -if BUILD_ZOIDFS -ZOID_DIR = ad_zoidfs -ZOID_LIB = ad_zoidfs/libadio_zoidfs.la -else -ZOID_DIR = -ZOID_LIB = -endif - -SUBDIRS = common include \ - $(BG_DIR) $(BGLOCKLESS_DIR) \ - $(GRIDFTP_DIR) $(LUSTRE_DIR) $(NFS_DIR) $(NTFS_DIR) $(PANFS_DIR) \ - $(PFS_DIR) $(PVFS_DIR) $(PVFS2_DIR) $(SFS_DIR) \ - $(TESTFS_DIR) $(UFS_DIR) $(XFS_DIR) $(ZOID_DIR) -DIST_SUBDIRS = common include \ - ad_bgl ad_bglockless ad_gridftp ad_lustre ad_nfs ad_ntfs \ - ad_panfs ad_pfs ad_pvfs ad_pvfs2 ad_sfs ad_testfs ad_ufs \ - ad_xfs ad_zoidfs - -# Library -noinst_LTLIBRARIES = libadio.la -libadio_la_SOURCES = -libadio_la_LIBADD = \ - common/libadio_common.la \ - $(BG_LIB) $(BGLOCKLESS_LIB) \ - $(GRIDFTP_LIB) $(LUSTRE_LIB) $(NFS_LIB) $(NTFS_LIB) $(PANFS_LIB) \ - $(PFS_LIB) $(PVFS_LIB) $(PVFS2_LIB) $(SFS_LIB) \ - $(TESTFS_LIB) $(UFS_LIB) $(XFS_LIB) $(ZOID_LIB) diff --git a/ompi/mca/io/romio/romio/adio/Makefile.mk b/ompi/mca/io/romio/romio/adio/Makefile.mk new file mode 100644 index 0000000000..31a0ba4fe5 --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/Makefile.mk @@ -0,0 +1,46 @@ +## -*- Mode: Makefile; -*- +## vim: set ft=automake : +## +## (C) 2011 by Argonne National Laboratory. +## See COPYRIGHT in top-level directory. +## + +AM_CPPFLAGS += -I$(top_builddir)/adio/include -I$(top_srcdir)/adio/include + +noinst_HEADERS += \ + adio/include/adio.h \ + adio/include/adio_cb_config_list.h \ + adio/include/adio_extern.h \ + adio/include/adioi.h \ + adio/include/adioi_errmsg.h \ + adio/include/adioi_error.h \ + adio/include/adioi_fs_proto.h \ + adio/include/heap-sort.h \ + adio/include/mpio_error.h \ + adio/include/mpipr.h \ + adio/include/mpiu_greq.h \ + adio/include/nopackage.h \ + adio/include/mpiu_external32.h \ + adio/include/romioconf-undefs.h + +include $(top_srcdir)/adio/ad_bg/Makefile.mk +include $(top_srcdir)/adio/ad_bgl/Makefile.mk +include $(top_srcdir)/adio/ad_bglockless/Makefile.mk +include $(top_srcdir)/adio/ad_gridftp/Makefile.mk +include $(top_srcdir)/adio/ad_hfs/Makefile.mk +include $(top_srcdir)/adio/ad_lustre/Makefile.mk +include $(top_srcdir)/adio/ad_nfs/Makefile.mk +## NTFS builds are handled entirely by the separate Windows build system +##include $(top_srcdir)/adio/ad_ntfs/Makefile.mk +include $(top_srcdir)/adio/ad_panfs/Makefile.mk +include $(top_srcdir)/adio/ad_pfs/Makefile.mk +include $(top_srcdir)/adio/ad_piofs/Makefile.mk +include $(top_srcdir)/adio/ad_pvfs/Makefile.mk +include $(top_srcdir)/adio/ad_pvfs2/Makefile.mk +include $(top_srcdir)/adio/ad_sfs/Makefile.mk +include $(top_srcdir)/adio/ad_testfs/Makefile.mk +include $(top_srcdir)/adio/ad_ufs/Makefile.mk +include $(top_srcdir)/adio/ad_xfs/Makefile.mk +include $(top_srcdir)/adio/ad_zoidfs/Makefile.mk +include $(top_srcdir)/adio/common/Makefile.mk + diff --git a/ompi/mca/io/romio/romio/adio/ad_bg/.gitignore b/ompi/mca/io/romio/romio/adio/ad_bg/.gitignore new file mode 100644 index 0000000000..509a693e92 --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_bg/.gitignore @@ -0,0 +1,11 @@ +/Makefile +/.deps +/*.bb +/*.bbg +/*.gcda +/*.gcno +/.libs +/.libstamp* +/*.lo +/.*-cache +/.state-cache diff --git a/ompi/mca/io/romio/romio/adio/ad_bg/Makefile.mk b/ompi/mca/io/romio/romio/adio/ad_bg/Makefile.mk new file mode 100644 index 0000000000..ea01bc032a --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_bg/Makefile.mk @@ -0,0 +1,35 @@ +## -*- Mode: Makefile; -*- +## vim: set ft=automake : +## +## (C) 2011 by Argonne National Laboratory. +## See COPYRIGHT in top-level directory. +## + +if BUILD_AD_BG + +AM_CPPFLAGS += -DBGL_OPTIM_STEP1_2=1 -DBGL_OPTIM_STEP1_1=1 + +noinst_HEADERS += \ + adio/ad_bg/ad_bg_aggrs.h \ + adio/ad_bg/ad_bg.h \ + adio/ad_bg/ad_bg_pset.h \ + adio/ad_bg/ad_bg_tuning.h + +romio_other_sources += \ + adio/ad_bg/ad_bg_aggrs.c \ + adio/ad_bg/ad_bg_close.c \ + adio/ad_bg/ad_bg_flush.c \ + adio/ad_bg/ad_bg_hints.c \ + adio/ad_bg/ad_bg_pset.c \ + adio/ad_bg/ad_bg_read.c \ + adio/ad_bg/ad_bg_tuning.c \ + adio/ad_bg/ad_bg_write.c \ + adio/ad_bg/ad_bg.c \ + adio/ad_bg/ad_bg_fcntl.c \ + adio/ad_bg/ad_bg_getsh.c \ + adio/ad_bg/ad_bg_open.c \ + adio/ad_bg/ad_bg_rdcoll.c \ + adio/ad_bg/ad_bg_setsh.c \ + adio/ad_bg/ad_bg_wrcoll.c + +endif BUILD_AD_BG diff --git a/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg.c b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg.c new file mode 100644 index 0000000000..53128e93a4 --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg.c @@ -0,0 +1,51 @@ +/* ---------------------------------------------------------------- */ +/* (C)Copyright IBM Corp. 2007, 2008 */ +/* ---------------------------------------------------------------- */ +/** + * \file ad_bg.c + * \brief ??? + */ + +/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* + * Copyright (C) 2001 University of Chicago. + * See COPYRIGHT notice in top-level directory. + */ +#define BG_OPTIM_STEP1_1 1 +#include "ad_bg.h" + +/* adioi.h has the ADIOI_Fns_struct define */ +#include "adioi.h" + +struct ADIOI_Fns_struct ADIO_BG_operations = { + ADIOI_BG_Open, /* Open */ + ADIOI_GEN_OpenColl, /* Collective open */ + ADIOI_BG_ReadContig, /* ReadContig */ + ADIOI_BG_WriteContig, /* WriteContig */ + ADIOI_BG_ReadStridedColl, /* ReadStridedColl */ + ADIOI_BG_WriteStridedColl, /* WriteStridedColl */ + ADIOI_GEN_SeekIndividual, /* SeekIndividual */ + ADIOI_BG_Fcntl, /* Fcntl */ + ADIOI_BG_SetInfo, /* SetInfo */ + ADIOI_BG_ReadStrided, /* ReadStrided */ + ADIOI_BG_WriteStrided, /* WriteStrided */ + ADIOI_BG_Close, /* Close */ +#ifdef ROMIO_HAVE_WORKING_AIO +#warning Consider BG support for NFS before enabling this. + ADIOI_GEN_IreadContig, /* IreadContig */ + ADIOI_GEN_IwriteContig, /* IwriteContig */ +#else + ADIOI_FAKE_IreadContig, /* IreadContig */ + ADIOI_FAKE_IwriteContig, /* IwriteContig */ +#endif + ADIOI_GEN_IODone, /* ReadDone */ + ADIOI_GEN_IODone, /* WriteDone */ + ADIOI_GEN_IOComplete, /* ReadComplete */ + ADIOI_GEN_IOComplete, /* WriteComplete */ + ADIOI_GEN_IreadStrided, /* IreadStrided */ + ADIOI_GEN_IwriteStrided, /* IwriteStrided */ + ADIOI_BG_Flush, /* Flush */ + ADIOI_GEN_Resize, /* Resize */ + ADIOI_GEN_Delete, /* Delete */ + ADIOI_GEN_Feature, /* Features */ +}; diff --git a/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg.h b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg.h new file mode 100644 index 0000000000..6a0a189034 --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg.h @@ -0,0 +1,97 @@ +/* ---------------------------------------------------------------- */ +/* (C)Copyright IBM Corp. 2007, 2008 */ +/* ---------------------------------------------------------------- */ +/** + * \file ad_bg.h + * \brief ??? + */ + +/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* + * Copyright (C) 1997 University of Chicago. + * See COPYRIGHT notice in top-level directory. + */ + +#ifndef AD_BG_INCLUDE +#define AD_BG_INCLUDE + +#include +#include +#include +#include +#include "adio.h" + +#ifdef HAVE_SIGNAL_H +#include +#endif +#ifdef HAVE_AIO_H +#include +#endif + +#if 0 +int ADIOI_BG_aio(ADIO_File fd, void *buf, int len, ADIO_Offset offset, + int wr, void *handle); +#endif + +void ADIOI_BG_Open(ADIO_File fd, int *error_code); + +void ADIOI_BG_Close(ADIO_File fd, int *error_code); + +void ADIOI_BG_ReadContig(ADIO_File fd, void *buf, int count, + MPI_Datatype datatype, int file_ptr_type, + ADIO_Offset offset, ADIO_Status *status, int + *error_code); +void ADIOI_BG_WriteContig(ADIO_File fd, const void *buf, int count, + MPI_Datatype datatype, int file_ptr_type, + ADIO_Offset offset, ADIO_Status *status, int + *error_code); +#if 0 +void ADIOI_BG_IwriteContig(ADIO_File fd, void *buf, int count, + MPI_Datatype datatype, int file_ptr_type, + ADIO_Offset offset, ADIO_Request *request, int + *error_code); +void ADIOI_BG_IreadContig(ADIO_File fd, void *buf, int count, + MPI_Datatype datatype, int file_ptr_type, + ADIO_Offset offset, ADIO_Request *request, int + *error_code); +int ADIOI_BG_ReadDone(ADIO_Request *request, ADIO_Status *status, int + *error_code); +int ADIOI_BG_WriteDone(ADIO_Request *request, ADIO_Status *status, int + *error_code); +void ADIOI_BG_ReadComplete(ADIO_Request *request, ADIO_Status *status, int + *error_code); +void ADIOI_BG_WriteComplete(ADIO_Request *request, ADIO_Status *status, + int *error_code); +#endif +void ADIOI_BG_Fcntl(ADIO_File fd, int flag, ADIO_Fcntl_t *fcntl_struct, int + *error_code); +void ADIOI_BG_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code); + +void ADIOI_BG_WriteStrided(ADIO_File fd, const void *buf, int count, + MPI_Datatype datatype, int file_ptr_type, + ADIO_Offset offset, ADIO_Status *status, int + *error_code); +void ADIOI_BG_ReadStrided(ADIO_File fd, void *buf, int count, + MPI_Datatype datatype, int file_ptr_type, + ADIO_Offset offset, ADIO_Status *status, int + *error_code); + +void ADIOI_BG_ReadStridedColl(ADIO_File fd, void *buf, int count, + MPI_Datatype datatype, int file_ptr_type, + ADIO_Offset offset, ADIO_Status *status, int + *error_code); + +void ADIOI_BG_WriteStridedColl(ADIO_File fd, const void *buf, int count, + MPI_Datatype datatype, int file_ptr_type, + ADIO_Offset offset, ADIO_Status *status, int + *error_code); + +void ADIOI_BG_Get_shared_fp(ADIO_File fd, int size, ADIO_Offset *shared_fp, int *error_code); +void ADIOI_BG_Set_shared_fp(ADIO_File fd, ADIO_Offset offset, int *error_code); + +void ADIOI_BG_Flush(ADIO_File fd, int *error_code); + +#include "ad_bg_tuning.h" + + +#endif diff --git a/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_aggrs.c b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_aggrs.c new file mode 100644 index 0000000000..a673c14e27 --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_aggrs.c @@ -0,0 +1,983 @@ +/* ---------------------------------------------------------------- */ +/* (C)Copyright IBM Corp. 2007, 2008 */ +/* ---------------------------------------------------------------- */ +/** + * \file ad_bg_aggrs.c + * \brief The externally used function from this file is is declared in ad_bg_aggrs.h + */ + +/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* + * Copyright (C) 1997-2001 University of Chicago. + * See COPYRIGHT notice in top-level directory. + */ + +/*#define TRACE_ON */ + +#include "adio.h" +#include "adio_cb_config_list.h" +#include "ad_bg.h" +#include "ad_bg_pset.h" +#include "ad_bg_aggrs.h" +#ifdef AGGREGATION_PROFILE +#include "mpe.h" +#endif + +#include "mpidi_macros.h" + +#ifdef USE_DBG_LOGGING + #define AGG_DEBUG 1 +#endif + +static int aggrsInPsetSize=0; +static int *aggrsInPset=NULL; + +/* Comments copied from common: + * This file contains four functions: + * + * ADIOI_Calc_aggregator() + * ADIOI_Calc_file_domains() + * ADIOI_Calc_my_req() + * ADIOI_Calc_others_req() + * + * The last three of these were originally in ad_read_coll.c, but they are + * also shared with ad_write_coll.c. I felt that they were better kept with + * the rest of the shared aggregation code. + */ + +/* Discussion of values available from above: + * + * ADIO_Offset st_offsets[0..nprocs-1] + * ADIO_Offset end_offsets[0..nprocs-1] + * These contain a list of start and end offsets for each process in + * the communicator. For example, an access at loc 10, size 10 would + * have a start offset of 10 and end offset of 19. + * int nprocs + * number of processors in the collective I/O communicator + * ADIO_Offset min_st_offset + * ADIO_Offset fd_start[0..nprocs_for_coll-1] + * starting location of "file domain"; region that a given process will + * perform aggregation for (i.e. actually do I/O) + * ADIO_Offset fd_end[0..nprocs_for_coll-1] + * start + size - 1 roughly, but it can be less, or 0, in the case of + * uneven distributions + */ + +/* forward declaration */ +static void +ADIOI_BG_compute_agg_ranklist_serial ( ADIO_File fd, + const ADIOI_BG_ConfInfo_t *confInfo, + ADIOI_BG_ProcInfo_t *all_procInfo, + int *aggrsInPset ); + +/* + * Compute the aggregator-related parameters that are required in 2-phase collective IO of ADIO. + * The parameters are + * . the number of aggregators (proxies) : fd->hints->cb_nodes + * . the ranks of the aggregators : fd->hints->ranklist + * By compute these two parameters in a BG-PSET-aware way, the default 2-phase collective IO of + * ADIO can work more efficiently. + */ +int +ADIOI_BG_gen_agg_ranklist(ADIO_File fd, int n_aggrs_per_pset) +{ + int r, s; + ADIOI_BG_ProcInfo_t *procInfo, *all_procInfo; + ADIOI_BG_ConfInfo_t *confInfo; + TRACE_ERR("Entering ADIOI_BG_gen_agg_ranklist\n"); + + MPI_Comm_size( fd->comm, &s ); + MPI_Comm_rank( fd->comm, &r ); + + /* Collect individual BG personality information */ + confInfo = ADIOI_BG_ConfInfo_new (); + procInfo = ADIOI_BG_ProcInfo_new (); + ADIOI_BG_persInfo_init( confInfo, procInfo, s, r, n_aggrs_per_pset, fd->comm); + + /* Gather BG personality infomation onto process 0 */ + /* if (r == 0) */ + all_procInfo = ADIOI_BG_ProcInfo_new_n (s); + if(s > aggrsInPsetSize) + { + if(aggrsInPset) ADIOI_Free(aggrsInPset); + aggrsInPset = (int *) ADIOI_Malloc (s *sizeof(int)); + aggrsInPsetSize = s; + } + + + MPI_Gather( (void *)procInfo, sizeof(ADIOI_BG_ProcInfo_t), MPI_BYTE, + (void *)all_procInfo, sizeof(ADIOI_BG_ProcInfo_t), MPI_BYTE, + 0, + fd->comm ); + + /* Compute a list of the ranks of chosen IO proxy CN on process 0 */ + if (r == 0) { + ADIOI_BG_compute_agg_ranklist_serial (fd, confInfo, all_procInfo, aggrsInPset); + /* ADIOI_BG_ProcInfo_free (all_procInfo);*/ + } + ADIOI_BG_ProcInfo_free (all_procInfo); + + /* Send the info of IO proxy CN to all processes and keep the info in fd->hints struct. + Declared in adio_cb_config_list.h */ + ADIOI_cb_bcast_rank_map(fd); + + /* Broadcast the BG-GPFS related file domain info */ + MPI_Bcast( (void *)aggrsInPset, + fd->hints->cb_nodes * sizeof(int), MPI_BYTE, + 0, + fd->comm ); + + ADIOI_BG_persInfo_free( confInfo, procInfo ); + TRACE_ERR("Leaving ADIOI_BG_gen_agg_ranklist\n"); + return 0; +} + + +/* There are some number of bridge nodes (randomly) distributed through the job + * We need to split the nodes among the bridge nodes */ +/* Maybe find which bridge node is closer (manhattan distance) and try to + * distribute evenly. + */ +/* + * Pick IO aggregators based on the under PSET organization and stores the ranks of the proxy CNs in tmp_ranklist. + * The first order of tmp_ranklist is : PSET number + * The secondary order of the list is determined in ADIOI_BG_select_agg_in_pset() and thus adjustable. + */ +typedef struct +{ + int rank; + int bridge; +} sortstruct; + +static int intsort(const void *p1, const void *p2) +{ + sortstruct *i1, *i2; + i1 = (sortstruct *)p1; + i2 = (sortstruct *)p2; + return(i1->bridge - i2->bridge); +} + +static int +ADIOI_BG_compute_agg_ranklist_serial_do (const ADIOI_BG_ConfInfo_t *confInfo, + ADIOI_BG_ProcInfo_t *all_procInfo, + int *aggrsInPset, + int *tmp_ranklist) +{ + TRACE_ERR("Entering ADIOI_BG_compute_agg_ranklist_serial_do\n"); + /* BES: This should be done in the init routines probably. */ + int i, j; + int aggTotal; + int distance, numAggs; + int *aggList; + /* Aggregators will be midpoints between sorted MPI rank lists of who shares a given + * bridge node */ + + sortstruct *bridgelist = (sortstruct *)ADIOI_Malloc(confInfo->nProcs * sizeof(sortstruct)); + for(i=0; i < confInfo->nProcs; i++) + { + bridgelist[i].bridge = all_procInfo[i].bridgeRank; + bridgelist[i].rank = i; + TRACE_ERR("bridgelist[%d].bridge: %d .rank: %d\n", i, bridgelist[i].bridge, i); + } + + /* This list contains rank->bridge info. Now, we need to sort this list. */ + qsort(bridgelist, confInfo->nProcs, sizeof(sortstruct), intsort); + + /* In this array, we can pick an appropriate number of midpoints based on + * our bridgenode index and the number of aggregators */ + + numAggs = confInfo->aggRatio * confInfo->ioMaxSize /*virtualPsetSize*/; + if(numAggs == 1) + aggTotal = 1; + else + /* the number of aggregators is (numAggs per bridgenode) plus each + * bridge node is an aggregator */ + aggTotal = confInfo->numBridgeRanks * (numAggs+1); + + distance = (confInfo->ioMaxSize /*virtualPsetSize*/ / numAggs); + TRACE_ERR("numBridgeRanks: %d, aggRatio: %f numBridge: %d pset size: %d numAggs: %d distance: %d, aggTotal: %d\n", confInfo->numBridgeRanks, confInfo->aggRatio, confInfo->numBridgeRanks, confInfo->ioMaxSize /*virtualPsetSize*/, numAggs, distance, aggTotal); + aggList = (int *)ADIOI_Malloc(aggTotal * sizeof(int)); + + + /* For each bridge node, determine who the aggregators will be */ + /* basically, the n*distance and bridge node */ + if(aggTotal == 1) /* special case when we only have one bridge node */ + aggList[0] = bridgelist[0].bridge; + else + { + for(i=0; i < confInfo->numBridgeRanks; i++) + { + aggList[i]=bridgelist[i*confInfo->ioMaxSize /*virtualPsetSize*/].bridge; + TRACE_ERR("aggList[%d]: %d\n", i, aggList[i]); + + for(j = 0; j < numAggs; j++) + { + /* Sets up a list of nodes which will act as aggregators. numAggs + * per bridge node total. The list of aggregators is + * bridgeNodes + * bridgeNode[0]aggr[0] + * bridgeNode[0]aggr[1]... + * bridgeNode[0]aggr[N]... + * ... + * bridgeNode[N]aggr[0].. + * bridgeNode[N]aggr[N] + */ + aggList[i*numAggs+j+confInfo->numBridgeRanks] = bridgelist[i*confInfo->ioMaxSize /*virtualPsetSize*/ + j*distance+1].rank; + TRACE_ERR("(post bridge) agglist[%d] -> %d\n", confInfo->numBridgeRanks +i*numAggs+j, aggList[i*numAggs+j+confInfo->numBridgeRanks]); + } + } + } + + memcpy(tmp_ranklist, aggList, (numAggs*confInfo->numBridgeRanks+numAggs)*sizeof(int)); + for(i=0;ihints struct + */ +static void +ADIOI_BG_compute_agg_ranklist_serial ( ADIO_File fd, + const ADIOI_BG_ConfInfo_t *confInfo, + ADIOI_BG_ProcInfo_t *all_procInfo, + int *aggrsInPset ) +{ + TRACE_ERR("Entering ADIOI_BG_compute_agg_ranklist_serial\n"); + int i; + int naggs; + int size; + int *tmp_ranklist; + + /* compute the ranklist of IO aggregators and put into tmp_ranklist */ + tmp_ranklist = (int *) ADIOI_Malloc (confInfo->nProcs * sizeof(int)); + +# if AGG_DEBUG + for (i=0; inProcs; i++) { + DBG_FPRINTF(stderr, "\tcpuid %1d, rank = %6d\n", all_procInfo[i].coreID, all_procInfo[i].rank ); + } +# endif + + naggs= + ADIOI_BG_compute_agg_ranklist_serial_do (confInfo, all_procInfo, aggrsInPset, tmp_ranklist); + +# define VERIFY 1 +# if VERIFY + DBG_FPRINTF(stderr, "\tconfInfo = min: %3d, max: %3d, naggrs: %3d, bridge: %3d, nprocs: %3d, vpset: %3d, tsize: %3d, ratio: %.4f; naggs = %d\n", + confInfo->ioMinSize , + confInfo->ioMaxSize , + confInfo->nAggrs , + confInfo->numBridgeRanks , + confInfo->nProcs , + confInfo->ioMaxSize /*virtualPsetSize*/ , + confInfo->cpuIDsize, + confInfo->aggRatio , + naggs ); +# endif + MPI_Comm_size( fd->comm, &size ); + /* This fix is for when the bridgenode rnk is not part of the particular + * subcomm associated with this MPI File operation. I don't know if + * this is the best/right answer but it passes the test cases at least. + * I don't know how common file IO in subcomms is anyway... */ + for(i=0;i size) + { + TRACE_ERR("Using 0 as tmp_ranklist[%d] instead of %d for comm %x\n", + i, tmp_ranklist[i], fd->comm); + tmp_ranklist[i] = 0; + } + } + +# if AGG_DEBUG + for (i=0; ihints */ + if(fd->hints->ranklist != NULL) ADIOI_Free (fd->hints->ranklist); + + fd->hints->cb_nodes = naggs; + fd->hints->ranklist = (int *) ADIOI_Malloc (naggs * sizeof(int)); + memcpy( fd->hints->ranklist, tmp_ranklist, naggs*sizeof(int) ); + + /* */ + ADIOI_Free( tmp_ranklist ); + TRACE_ERR("Leaving ADIOI_BG_compute_agg_ranklist_serial\n"); + return; +} + +/* Description from common/ad_aggregate.c. (Does it completely apply to bg?) + * ADIOI_Calc_aggregator() + * + * The intention here is to implement a function which provides basically + * the same functionality as in Rajeev's original version of + * ADIOI_Calc_my_req(). He used a ceiling division approach to assign the + * file domains, and we use the same approach here when calculating the + * location of an offset/len in a specific file domain. Further we assume + * this same distribution when calculating the rank_index, which is later + * used to map to a specific process rank in charge of the file domain. + * + * A better (i.e. more general) approach would be to use the list of file + * domains only. This would be slower in the case where the + * original ceiling division was used, but it would allow for arbitrary + * distributions of regions to aggregators. We'd need to know the + * nprocs_for_coll in that case though, which we don't have now. + * + * Note a significant difference between this function and Rajeev's old code: + * this code doesn't necessarily return a rank in the range + * 0..nprocs_for_coll; instead you get something in 0..nprocs. This is a + * result of the rank mapping; any set of ranks in the communicator could be + * used now. + * + * Returns an integer representing a rank in the collective I/O communicator. + * + * The "len" parameter is also modified to indicate the amount of data + * actually available in this file domain. + */ +/* + * This is more general aggregator search function which does not base on the assumption + * that each aggregator hosts the file domain with the same size + */ +int ADIOI_BG_Calc_aggregator(ADIO_File fd, + ADIO_Offset off, + ADIO_Offset min_off, + ADIO_Offset *len, + ADIO_Offset fd_size, + ADIO_Offset *fd_start, + ADIO_Offset *fd_end) +{ + int rank_index, rank; + ADIO_Offset avail_bytes; + TRACE_ERR("Entering ADIOI_BG_Calc_aggregator\n"); + + ADIOI_BG_assert ( (off <= fd_end[fd->hints->cb_nodes-1] && off >= min_off && fd_start[0] >= min_off ) ); + + /* binary search --> rank_index is returned */ + int ub = fd->hints->cb_nodes; + int lb = 0; + /* get an index into our array of aggregators */ + /* Common code for striping - bg doesn't use it but it's + here to make diff'ing easier. + rank_index = (int) ((off - min_off + fd_size)/ fd_size - 1); + + if (fd->hints->striping_unit > 0) { + * wkliao: implementation for file domain alignment + fd_start[] and fd_end[] have been aligned with file lock + boundaries when returned from ADIOI_Calc_file_domains() so cannot + just use simple arithmatic as above * + rank_index = 0; + while (off > fd_end[rank_index]) rank_index++; + } + bg does it's own striping below + */ + rank_index = fd->hints->cb_nodes / 2; + while ( off < fd_start[rank_index] || off > fd_end[rank_index] ) { + if ( off > fd_end [rank_index] ) { + lb = rank_index; + rank_index = (rank_index + ub) / 2; + } + else + if ( off < fd_start[rank_index] ) { + ub = rank_index; + rank_index = (rank_index + lb) / 2; + } + } + /* we index into fd_end with rank_index, and fd_end was allocated to be no + * bigger than fd->hins->cb_nodes. If we ever violate that, we're + * overrunning arrays. Obviously, we should never ever hit this abort */ + if (rank_index >= fd->hints->cb_nodes || rank_index < 0) { + FPRINTF(stderr, "Error in ADIOI_Calc_aggregator(): rank_index(%d) >= fd->hints->cb_nodes (%d) fd_size=%lld off=%lld\n", + rank_index,fd->hints->cb_nodes,fd_size,off); + MPI_Abort(MPI_COMM_WORLD, 1); + } + /* DBG_FPRINTF ("ADIOI_BG_Calc_aggregator: rank_index = %d\n", + rank_index ); */ + + /* + * remember here that even in Rajeev's original code it was the case that + * different aggregators could end up with different amounts of data to + * aggregate. here we use fd_end[] to make sure that we know how much + * data this aggregator is working with. + * + * the +1 is to take into account the end vs. length issue. + */ + avail_bytes = fd_end[rank_index] + 1 - off; + if (avail_bytes < *len && avail_bytes > 0) { + /* this file domain only has part of the requested contig. region */ + + *len = avail_bytes; + } + + /* map our index to a rank */ + /* NOTE: FOR NOW WE DON'T HAVE A MAPPING...JUST DO 0..NPROCS_FOR_COLL */ + rank = fd->hints->ranklist[rank_index]; + TRACE_ERR("Leaving ADIOI_BG_Calc_aggregator\n"); + + return rank; +} + +/* + * Compute a dynamic access range based file domain partition among I/O aggregators, + * which align to the GPFS block size + * Divide the I/O workload among "nprocs_for_coll" processes. This is + * done by (logically) dividing the file into file domains (FDs); each + * process may directly access only its own file domain. + * Additional effort is to make sure that each I/O aggregator get + * a file domain that aligns to the GPFS block size. So, there will + * not be any false sharing of GPFS file blocks among multiple I/O nodes. + * + * The common version of this now accepts a min_fd_size and striping_unit. + * It doesn't seem necessary here (using GPFS block sizes) but keep it in mind + * (e.g. we could pass striping unit instead of using fs_ptr->blksize). + */ +void ADIOI_BG_GPFS_Calc_file_domains(ADIO_Offset *st_offsets, + ADIO_Offset *end_offsets, + int nprocs, + int nprocs_for_coll, + ADIO_Offset *min_st_offset_ptr, + ADIO_Offset **fd_start_ptr, + ADIO_Offset **fd_end_ptr, + ADIO_Offset *fd_size_ptr, + void *fs_ptr) +{ + ADIO_Offset min_st_offset, max_end_offset, *fd_start, *fd_end, *fd_size; + int i, aggr; + TRACE_ERR("Entering ADIOI_BG_GPFS_Calc_file_domains\n"); + +#ifdef AGGREGATION_PROFILE + MPE_Log_event (5004, 0, NULL); +#endif + +# if AGG_DEBUG + static char myname[] = "ADIOI_BG_GPFS_Calc_file_domains"; + DBG_FPRINTF(stderr, "%s(%d): %d aggregator(s)\n", + myname,__LINE__,nprocs_for_coll); +# endif + __blksize_t blksize = 1048576; /* default to 1M */ + if(fs_ptr && ((ADIOI_BG_fs*)fs_ptr)->blksize) /* ignore null ptr or 0 blksize */ + blksize = ((ADIOI_BG_fs*)fs_ptr)->blksize; +# if AGG_DEBUG + DBG_FPRINTF(stderr,"%s(%d): Blocksize=%ld\n",myname,__LINE__,blksize); +# endif +/* find min of start offsets and max of end offsets of all processes */ + min_st_offset = st_offsets [0]; + max_end_offset = end_offsets[0]; + for (i=1; ihints->cb_nodes; i++) + if (fd->hints->ranklist[i] == myrank) return i; + return -1; +} + +/* + * ADIOI_BG_Calc_my_req() overrides ADIOI_Calc_my_req for the default implementation + * is specific for static file domain partitioning. + * + * ADIOI_Calc_my_req() - calculate what portions of the access requests + * of this process are located in the file domains of various processes + * (including this one) + */ +void ADIOI_BG_Calc_my_req(ADIO_File fd, ADIO_Offset *offset_list, ADIO_Offset *len_list, + int contig_access_count, ADIO_Offset + min_st_offset, ADIO_Offset *fd_start, + ADIO_Offset *fd_end, ADIO_Offset fd_size, + int nprocs, + int *count_my_req_procs_ptr, + int **count_my_req_per_proc_ptr, + ADIOI_Access **my_req_ptr, + int **buf_idx_ptr) +/* Possibly reconsider if buf_idx's are ok as int's, or should they be aints/offsets? + They are used as memory buffer indices so it seems like the 2G limit is in effect */ +{ + int *count_my_req_per_proc, count_my_req_procs, *buf_idx; + int i, l, proc; + ADIO_Offset fd_len, rem_len, curr_idx, off; + ADIOI_Access *my_req; + TRACE_ERR("Entering ADIOI_BG_Calc_my_req\n"); + +#ifdef AGGREGATION_PROFILE + MPE_Log_event (5024, 0, NULL); +#endif + + *count_my_req_per_proc_ptr = (int *) ADIOI_Calloc(nprocs,sizeof(int)); + count_my_req_per_proc = *count_my_req_per_proc_ptr; +/* count_my_req_per_proc[i] gives the no. of contig. requests of this + process in process i's file domain. calloc initializes to zero. + I'm allocating memory of size nprocs, so that I can do an + MPI_Alltoall later on.*/ + + buf_idx = (int *) ADIOI_Malloc(nprocs*sizeof(int)); +/* buf_idx is relevant only if buftype_is_contig. + buf_idx[i] gives the index into user_buf where data received + from proc. i should be placed. This allows receives to be done + without extra buffer. This can't be done if buftype is not contig. */ + + /* initialize buf_idx to -1 */ + for (i=0; i < nprocs; i++) buf_idx[i] = -1; + + /* one pass just to calculate how much space to allocate for my_req; + * contig_access_count was calculated way back in ADIOI_Calc_my_off_len() + */ + for (i=0; i < contig_access_count; i++) { + /* short circuit offset/len processing if len == 0 + * (zero-byte read/write */ + if (len_list[i] == 0) + continue; + off = offset_list[i]; + fd_len = len_list[i]; + /* note: we set fd_len to be the total size of the access. then + * ADIOI_Calc_aggregator() will modify the value to return the + * amount that was available from the file domain that holds the + * first part of the access. + */ + /* BES */ + proc = ADIOI_BG_Calc_aggregator(fd, off, min_st_offset, &fd_len, fd_size, + fd_start, fd_end); + count_my_req_per_proc[proc]++; + + /* figure out how much data is remaining in the access (i.e. wasn't + * part of the file domain that had the starting byte); we'll take + * care of this data (if there is any) in the while loop below. + */ + rem_len = len_list[i] - fd_len; + + while (rem_len > 0) { + off += fd_len; /* point to first remaining byte */ + fd_len = rem_len; /* save remaining size, pass to calc */ + proc = ADIOI_BG_Calc_aggregator(fd, off, min_st_offset, &fd_len, + fd_size, fd_start, fd_end); + + count_my_req_per_proc[proc]++; + rem_len -= fd_len; /* reduce remaining length by amount from fd */ + } + } + +/* now allocate space for my_req, offset, and len */ + + *my_req_ptr = (ADIOI_Access *) + ADIOI_Malloc(nprocs*sizeof(ADIOI_Access)); + my_req = *my_req_ptr; + + count_my_req_procs = 0; + for (i=0; i < nprocs; i++) { + if (count_my_req_per_proc[i]) { + my_req[i].offsets = (ADIO_Offset *) + ADIOI_Malloc(count_my_req_per_proc[i] * sizeof(ADIO_Offset)); + my_req[i].lens = (int *) + ADIOI_Malloc(count_my_req_per_proc[i] * sizeof(int)); + count_my_req_procs++; + } + my_req[i].count = 0; /* will be incremented where needed + later */ + } + +/* now fill in my_req */ + curr_idx = 0; + for (i=0; i 0) { + off += fd_len; + fd_len = rem_len; + proc = ADIOI_BG_Calc_aggregator(fd, off, min_st_offset, &fd_len, + fd_size, fd_start, fd_end); + + if (buf_idx[proc] == -1) + { + ADIOI_Assert(curr_idx == (int) curr_idx); + buf_idx[proc] = (int) curr_idx; + } + + l = my_req[proc].count; + curr_idx += fd_len; + rem_len -= fd_len; + + my_req[proc].offsets[l] = off; + ADIOI_Assert(fd_len == (int) fd_len); + my_req[proc].lens[l] = (int) fd_len; + my_req[proc].count++; + } + } + + + +#ifdef AGG_DEBUG + for (i=0; i 0) { + DBG_FPRINTF(stderr, "data needed from %d (count = %d):\n", i, + my_req[i].count); + for (l=0; l < my_req[i].count; l++) { + DBG_FPRINTF(stderr, " off[%d] = %lld, len[%d] = %d\n", l, + my_req[i].offsets[l], l, my_req[i].lens[l]); + } + } + DBG_FPRINTF(stderr, "buf_idx[%d] = 0x%x\n", i, buf_idx[i]); + } +#endif + + *count_my_req_procs_ptr = count_my_req_procs; + *buf_idx_ptr = buf_idx; +#ifdef AGGREGATION_PROFILE + MPE_Log_event (5025, 0, NULL); +#endif + TRACE_ERR("Leaving ADIOI_BG_Calc_my_req\n"); +} + +/* + * ADIOI_Calc_others_req (copied to bg and switched to all to all for performance) + * + * param[in] count_my_req_procs Number of processes whose file domain my + * request touches. + * param[in] count_my_req_per_proc count_my_req_per_proc[i] gives the no. of + * contig. requests of this process in + * process i's file domain. + * param[in] my_req A structure defining my request + * param[in] nprocs Number of nodes in the block + * param[in] myrank Rank of this node + * param[out] count_others_req_proc_ptr Number of processes whose requests lie in + * my process's file domain (including my + * process itself) + * param[out] others_req_ptr Array of other process' requests that lie + * in my process's file domain + */ +void ADIOI_BG_Calc_others_req(ADIO_File fd, int count_my_req_procs, + int *count_my_req_per_proc, + ADIOI_Access *my_req, + int nprocs, int myrank, + int *count_others_req_procs_ptr, + ADIOI_Access **others_req_ptr) +{ + TRACE_ERR("Entering ADIOI_BG_Calc_others_req\n"); +/* determine what requests of other processes lie in this process's + file domain */ + +/* count_others_req_procs = number of processes whose requests lie in + this process's file domain (including this process itself) + count_others_req_per_proc[i] indicates how many separate contiguous + requests of proc. i lie in this process's file domain. */ + + int *count_others_req_per_proc, count_others_req_procs; + int i; + ADIOI_Access *others_req; + + /* Parameters for MPI_Alltoallv */ + int *scounts, *sdispls, *rcounts, *rdispls; + + /* Parameters for MPI_Alltoallv. These are the buffers, which + * are later computed to be the lowest address of all buffers + * to be sent/received for offsets and lengths. Initialize to + * the highest possible address which is the current minimum. + */ + void *sendBufForOffsets=(void*)0xFFFFFFFFFFFFFFFF, + *sendBufForLens =(void*)0xFFFFFFFFFFFFFFFF, + *recvBufForOffsets=(void*)0xFFFFFFFFFFFFFFFF, + *recvBufForLens =(void*)0xFFFFFFFFFFFFFFFF; + +/* first find out how much to send/recv and from/to whom */ +#ifdef AGGREGATION_PROFILE + MPE_Log_event (5026, 0, NULL); +#endif + /* Send 1 int to each process. count_my_req_per_proc[i] is the number of + * requests that my process will do to the file domain owned by process[i]. + * Receive 1 int from each process. count_others_req_per_proc[i] is the number of + * requests that process[i] will do to the file domain owned by my process. + */ + count_others_req_per_proc = (int *) ADIOI_Malloc(nprocs*sizeof(int)); +/* cora2a1=timebase(); */ +for(i=0;icomm); + +/* total_cora2a+=timebase()-cora2a1; */ + + /* Allocate storage for an array of other nodes' accesses of our + * node's file domain. Also allocate storage for the alltoallv + * parameters. + */ + *others_req_ptr = (ADIOI_Access *) + ADIOI_Malloc(nprocs*sizeof(ADIOI_Access)); + others_req = *others_req_ptr; + + scounts = ADIOI_Malloc(nprocs*sizeof(int)); + sdispls = ADIOI_Malloc(nprocs*sizeof(int)); + rcounts = ADIOI_Malloc(nprocs*sizeof(int)); + rdispls = ADIOI_Malloc(nprocs*sizeof(int)); + + /* If process[i] has any requests in my file domain, + * initialize an ADIOI_Access structure that will describe each request + * from process[i]. The offsets, lengths, and buffer pointers still need + * to be obtained to complete the setting of this structure. + */ + count_others_req_procs = 0; + for (i=0; icomm); + for (i=0; icomm); + + /************************/ + /* Exchange the lengths */ + /************************/ + + for (i=0; icomm); + + /* Clean up */ + ADIOI_Free(count_others_req_per_proc); + ADIOI_Free (scounts); + ADIOI_Free (sdispls); + ADIOI_Free (rcounts); + ADIOI_Free (rdispls); + + *count_others_req_procs_ptr = count_others_req_procs; +#ifdef AGGREGATION_PROFILE + MPE_Log_event (5027, 0, NULL); +#endif + TRACE_ERR("Leaving ADIOI_BG_Calc_others_req\n"); +} diff --git a/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_aggrs.h b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_aggrs.h new file mode 100644 index 0000000000..32cf84e119 --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_aggrs.h @@ -0,0 +1,104 @@ +/* ---------------------------------------------------------------- */ +/* (C)Copyright IBM Corp. 2007, 2008 */ +/* ---------------------------------------------------------------- */ +/** + * \file ad_bg_aggrs.h + * \brief ??? + */ + +/* + * File: ad_bg_aggrs.h + * + * Declares functions specific for BG/L - GPFS parallel I/O solution. The implemented optimizations are: + * . Aligned file-domain partitioning, integrated in 7/28/2005 + * + * In addition, following optimizations are planned: + * . Integrating multiple file-domain partitioning schemes + * (corresponding to Alok Chouhdary's persistent file domain work). + */ + +#ifndef AD_BG_AGGRS_H_ +#define AD_BG_AGGRS_H_ + +#include "adio.h" +#include + +#if !defined(GPFS_SUPER_MAGIC) + #define GPFS_SUPER_MAGIC (0x47504653) +#endif + + /* File system (BG) specific information - + hung off of ADIOI_FileD file descriptor (fd->fs_ptr) at open */ + typedef struct ADIOI_BG_fs_s { + __blksize_t blksize; + int fsync_aggr; /* "fsync aggregation" flags (below) */ +#define ADIOI_BG_FSYNC_AGGREGATION_DISABLED 0x00 +#define ADIOI_BG_FSYNC_AGGREGATION_ENABLED 0x01 +#define ADIOI_BG_FSYNC_AGGREGATOR 0x10 /* This rank is an aggregator */ + } ADIOI_BG_fs; + + /* generate a list of I/O aggregators that utilizes BG-PSET orginization. */ + int ADIOI_BG_gen_agg_ranklist(ADIO_File fd, int n_aggrs_per_pset); + + /* overriding ADIOI_Calc_file_domains() to apply 'aligned file domain partitioning'. */ + void ADIOI_BG_GPFS_Calc_file_domains(ADIO_Offset *st_offsets, + ADIO_Offset *end_offsets, + int nprocs, + int nprocs_for_coll, + ADIO_Offset *min_st_offset_ptr, + ADIO_Offset **fd_start_ptr, + ADIO_Offset **fd_end_ptr, + ADIO_Offset *fd_size_ptr, + void *fs_ptr); + + /* a utilitiy function for debugging */ + int ADIOI_BG_Aggrs_index(ADIO_File fd, int myrank ); + + /* overriding ADIOI_Calc_aggregator() for the default implementation is specific for + static file domain partitioning */ + int ADIOI_BG_Calc_aggregator(ADIO_File fd, + ADIO_Offset off, + ADIO_Offset min_off, + ADIO_Offset *len, + ADIO_Offset fd_size, + ADIO_Offset *fd_start, + ADIO_Offset *fd_end); + + /* overriding ADIOI_Calc_my_req for the default implementation is specific for + static file domain partitioning */ + void ADIOI_BG_Calc_my_req ( ADIO_File fd, ADIO_Offset *offset_list, ADIO_Offset *len_list, + int contig_access_count, ADIO_Offset + min_st_offset, ADIO_Offset *fd_start, + ADIO_Offset *fd_end, ADIO_Offset fd_size, + int nprocs, + int *count_my_req_procs_ptr, + int **count_my_req_per_proc_ptr, + ADIOI_Access **my_req_ptr, + int **buf_idx_ptr); + + /* + * ADIOI_Calc_others_req + * + * param[in] count_my_req_procs Number of processes whose file domain my + * request touches. + * param[in] count_my_req_per_proc count_my_req_per_proc[i] gives the no. of + * contig. requests of this process in + * process i's file domain. + * param[in] my_req A structure defining my request + * param[in] nprocs Number of nodes in the block + * param[in] myrank Rank of this node + * param[out] count_others_req_proc_ptr Number of processes whose requests lie in + * my process's file domain (including my + * process itself) + * param[out] others_req_ptr Array of other process' requests that lie + * in my process's file domain + */ + void ADIOI_BG_Calc_others_req(ADIO_File fd, int count_my_req_procs, + int *count_my_req_per_proc, + ADIOI_Access *my_req, + int nprocs, int myrank, + int *count_others_req_procs_ptr, + ADIOI_Access **others_req_ptr); + + +#endif /* AD_BG_AGGRS_H_ */ diff --git a/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_close.c b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_close.c new file mode 100644 index 0000000000..9eddc20bba --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_close.c @@ -0,0 +1,53 @@ +/* ---------------------------------------------------------------- */ +/* (C)Copyright IBM Corp. 2007, 2008 */ +/* ---------------------------------------------------------------- */ +/** + * \file ad_bg_close.c + * \brief ??? + */ + +/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* + * Copyright (C) 1997 University of Chicago. + * See COPYRIGHT notice in top-level directory. + */ + +#include "ad_bg.h" +#include "ad_bg_aggrs.h" + +void ADIOI_BG_Close(ADIO_File fd, int *error_code) +{ + int err, derr=0; + static char myname[] = "ADIOI_BG_CLOSE"; + +#ifdef PROFILE + MPE_Log_event(9, 0, "start close"); +#endif + + err = close(fd->fd_sys); + if (fd->fd_direct >= 0) + { + derr = close(fd->fd_direct); + } + +#ifdef PROFILE + MPE_Log_event(10, 0, "end close"); +#endif + +/* FPRINTF(stderr,"%s(%d):'%s'. Free %#X\n",myname,__LINE__,fd->filename,(int)fd->fs_ptr);*/ + if (fd->fs_ptr != NULL) { + ADIOI_Free(fd->fs_ptr); + fd->fs_ptr = NULL; + } + fd->fd_sys = -1; + fd->fd_direct = -1; + + if (err == -1 || derr == -1) + { + *error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, + myname, __LINE__, MPI_ERR_IO, + "**io", + "**io %s", strerror(errno)); + } + else *error_code = MPI_SUCCESS; +} diff --git a/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_fcntl.c b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_fcntl.c new file mode 100644 index 0000000000..05cce4d2d6 --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_fcntl.c @@ -0,0 +1,58 @@ +/* ---------------------------------------------------------------- */ +/* (C)Copyright IBM Corp. 2007, 2008 */ +/* ---------------------------------------------------------------- */ +/** + * \file ad_bg_fcntl.c + * \brief ??? + */ + +/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* + * Copyright (C) 1997 University of Chicago. + * See COPYRIGHT notice in top-level directory. + */ + +#include "ad_bg.h" +#include "adio_extern.h" +/* #ifdef MPISGI +#include "mpisgi2.h" +#endif */ + +void ADIOI_BG_Fcntl(ADIO_File fd, int flag, ADIO_Fcntl_t *fcntl_struct, + int *error_code) +{ + static char myname[] = "ADIOI_BG_FCNTL"; + + switch(flag) { + case ADIO_FCNTL_GET_FSIZE: + fcntl_struct->fsize = lseek(fd->fd_sys, 0, SEEK_END); + if (fd->fp_sys_posn != -1) + lseek(fd->fd_sys, fd->fp_sys_posn, SEEK_SET); + if (fcntl_struct->fsize == -1) { + *error_code = MPIO_Err_create_code(MPI_SUCCESS, + MPIR_ERR_RECOVERABLE, myname, + __LINE__, MPI_ERR_IO, "**io", + "**io %s", strerror(errno)); + } + else *error_code = MPI_SUCCESS; + break; + + case ADIO_FCNTL_SET_DISKSPACE: + ADIOI_GEN_Prealloc(fd, fcntl_struct->diskspace, error_code); + break; + + case ADIO_FCNTL_SET_ATOMICITY: + fd->atomicity = (fcntl_struct->atomicity == 0) ? 0 : 1; + *error_code = MPI_SUCCESS; + break; + + /* --BEGIN ERROR HANDLING-- */ + default: + *error_code = MPIO_Err_create_code(MPI_SUCCESS, + MPIR_ERR_RECOVERABLE, + myname, __LINE__, + MPI_ERR_ARG, + "**flag", "**flag %d", flag); + /* --END ERROR HANDLING-- */ + } +} diff --git a/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_flush.c b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_flush.c new file mode 100644 index 0000000000..b4fc67548f --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_flush.c @@ -0,0 +1,90 @@ +/* ---------------------------------------------------------------- */ +/* (C)Copyright IBM Corp. 2007, 2008 */ +/* ---------------------------------------------------------------- */ +/** + * \file ad_bg_flush.c + * \brief Scalable flush based on underlying filesystem and psets + */ + +/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* + * + * Copyright (C) 1997 University of Chicago. + * See COPYRIGHT notice in top-level directory. + */ + +#include "ad_bg.h" +#include "ad_bg_aggrs.h" + +void ADIOI_BG_Flush(ADIO_File fd, int *error_code) +{ + int err=0; + static char myname[] = "ADIOI_BG_FLUSH"; + + + if(((ADIOI_BG_fs*)fd->fs_ptr)->fsync_aggr & ADIOI_BG_FSYNC_AGGREGATION_ENABLED) + { + int rank; + + /* Barrier so we can collectively do fewer fsync's */ + MPI_Barrier(fd->comm); + + MPI_Comm_rank(fd->comm, &rank); + + /* All ranks marked as "fsync aggregators" should fsync. + (We currently only do one fsync on rank 0 but this is general + enough to support >1 aggregator using allreduce to get the + results instead of simply bcast'ing the results from rank 0.)*/ + if(((ADIOI_BG_fs*)fd->fs_ptr)->fsync_aggr & ADIOI_BG_FSYNC_AGGREGATOR) + { + err = fsync(fd->fd_sys); + DBG_FPRINTF(stderr,"aggregation:fsync %s, err=%#X, errno=%#X\n",fd->filename, err, errno); + /* We want errno, not the return code if it failed */ + if (err == -1) err = errno; + else err = 0; + } + /* Just pick an errno (using unsigned MPI_MAX) from any failures */ + MPI_Allreduce( MPI_IN_PLACE, (unsigned*)&err, 1, MPI_UNSIGNED, MPI_MAX, fd->comm); + DBGV_FPRINTF(stderr,"aggregation result:fsync %s, errno %#X,\n",fd->filename, err); + + if (err) /* if it's non-zero, it must be an errno */ + { + errno = err; + err = -1; + } + } + else /* Non-aggregated fsync */ + { +#ifdef USE_DBG_LOGGING + int rank; +#endif + err = fsync(fd->fd_sys); +#ifdef USE_DBG_LOGGING + MPI_Comm_rank(fd->comm, &rank); + + if(rank == 0) + { + DBG_FPRINTF(stderr,"no aggregation:fsync %s, err=%#X, errno=%#X\n",fd->filename, err, errno); + } + else + { + DBGV_FPRINTF(stderr,"no aggregation:fsync %s, err=%#X, errno=%#X\n",fd->filename, err, errno); + } +#endif + } + + /* --BEGIN ERROR HANDLING-- */ + if (err == -1) + { + *error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, + myname, __LINE__, MPI_ERR_IO, + "**io", + "**io %s", strerror(errno)); + DBGT_FPRINTF(stderr,"fsync %s, err=%#X, errno=%#X\n",fd->filename, err, errno); + return; + } + /* --END ERROR HANDLING-- */ + + *error_code = MPI_SUCCESS; +} + diff --git a/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_getsh.c b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_getsh.c new file mode 100644 index 0000000000..fb8de12efb --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_getsh.c @@ -0,0 +1,84 @@ +/* ---------------------------------------------------------------- */ +/* (C)Copyright IBM Corp. 2007, 2008 */ +/* ---------------------------------------------------------------- */ +/** + * \file ad_bg_getsh.c + * \brief ??? + */ + +/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* + * Copyright (C) 1997 University of Chicago. + * See COPYRIGHT notice in top-level directory. + */ + +#include "ad_bg.h" + +/* returns the current location of the shared_fp in terms of the + no. of etypes relative to the current view, and also increments the + shared_fp by the number of etypes to be accessed (incr) in the read + or write following this function. */ + +void ADIOI_BG_Get_shared_fp(ADIO_File fd, int incr, ADIO_Offset *shared_fp, + int *error_code) +{ + ADIO_Offset new_fp; + int err; + MPI_Comm dupcommself; + static char myname[] = "ADIOI_BG_GET_SHARED_FP"; + + if (fd->shared_fp_fd == ADIO_FILE_NULL) { + MPI_Comm_dup(MPI_COMM_SELF, &dupcommself); + fd->shared_fp_fd = ADIO_Open(MPI_COMM_SELF, + dupcommself, + fd->shared_fp_fname, + fd->file_system, + fd->fns, + ADIO_CREATE | ADIO_RDWR | ADIO_DELETE_ON_CLOSE, + 0, + MPI_BYTE, + MPI_BYTE, + MPI_INFO_NULL, + ADIO_PERM_NULL, + error_code); + if (*error_code != MPI_SUCCESS) return; + *shared_fp = 0; + ADIOI_WRITE_LOCK(fd->shared_fp_fd, 0, SEEK_SET, sizeof(ADIO_Offset)); + err = read(fd->shared_fp_fd->fd_sys, shared_fp, sizeof(ADIO_Offset)); + /* if the file is empty, the above read may return error + (reading beyond end of file). In that case, shared_fp = 0, + set above, is the correct value. */ + } + else { + ADIOI_WRITE_LOCK(fd->shared_fp_fd, 0, SEEK_SET, sizeof(ADIO_Offset)); + + err = lseek(fd->shared_fp_fd->fd_sys, 0, SEEK_SET); + if (err == 0) { + err = read(fd->shared_fp_fd->fd_sys, shared_fp, + sizeof(ADIO_Offset)); + } + if (err == -1) { + ADIOI_UNLOCK(fd->shared_fp_fd, 0, SEEK_SET, sizeof(ADIO_Offset)); + *error_code = MPIO_Err_create_code(MPI_SUCCESS, + MPIR_ERR_RECOVERABLE, myname, + __LINE__, MPI_ERR_IO, "**io", + "**io %s", strerror(errno)); + return; + } + } + + new_fp = *shared_fp + incr; + + err = lseek(fd->shared_fp_fd->fd_sys, 0, SEEK_SET); + if (err == 0) { + err = write(fd->shared_fp_fd->fd_sys, &new_fp, sizeof(ADIO_Offset)); + } + ADIOI_UNLOCK(fd->shared_fp_fd, 0, SEEK_SET, sizeof(ADIO_Offset)); + if (err == -1) { + *error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, + myname, __LINE__, MPI_ERR_IO, + "**io", + "**io %s", strerror(errno)); + } + else *error_code = MPI_SUCCESS; +} diff --git a/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_hints.c b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_hints.c new file mode 100644 index 0000000000..1e4dbba16d --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_hints.c @@ -0,0 +1,542 @@ +/* ---------------------------------------------------------------- */ +/* (C)Copyright IBM Corp. 2007, 2008 */ +/* ---------------------------------------------------------------- */ +/** + * \file ad_bg_hints.c + * \brief BlueGene hint processing + */ + +/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* + * Copyright (C) 1997 University of Chicago. + * See COPYRIGHT notice in top-level directory. + */ + +#include "adio.h" +#include "adio_extern.h" + +#include "ad_bg.h" +#include "ad_bg_pset.h" +#include "ad_bg_aggrs.h" + +#define ADIOI_BG_CB_BUFFER_SIZE_DFLT "16777216" +#define ADIOI_BG_IND_RD_BUFFER_SIZE_DFLT "4194304" +#define ADIOI_BG_IND_WR_BUFFER_SIZE_DFLT "4194304" +#define ADIOI_BG_NAGG_IN_PSET_HINT_NAME "bg_nodes_pset" +/** \page mpiio_vars MPIIO Configuration + * + * BlueGene MPIIO configuration and performance tuning. Used by ad_bg and ad_bglockless ADIO's. + * + * \section hint_sec Hints + * - bg_nodes_pset - Specify how many aggregators to use per pset. + * This hint will override the cb_nodes hint based on BlueGene psets. + * - N - Use N nodes per pset as aggregators. + * - Default is based on partition configuration and cb_nodes. + * + * The following default key/value pairs may differ from other platform defaults. + * + * - key = cb_buffer_size value = 16777216 + * - key = romio_cb_read value = enable + * - key = romio_cb_write value = enable + * - key = ind_rd_buffer_size value = 4194304 + * - key = ind_wr_buffer_size value = 4194304 + */ + +/* Compute the aggregator-related parameters that are required in 2-phase collective IO of ADIO. */ +extern int +ADIOI_BG_gen_agg_ranklist(ADIO_File fd, int n_proxy_per_pset); + +void ADIOI_BG_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code) +{ +/* if fd->info is null, create a new info object. + Initialize fd->info to default values. + Initialize fd->hints to default values. + Examine the info object passed by the user. If it contains values that + ROMIO understands, override the default. */ + + MPI_Info info; + char *value; + int flag, intval, tmp_val, nprocs=0, nprocs_is_valid = 0; + static char myname[] = "ADIOI_BG_SETINFO"; + + int did_anything = 0; + + if (fd->info == MPI_INFO_NULL) MPI_Info_create(&(fd->info)); + info = fd->info; + + /* Note that fd->hints is allocated at file open time; thus it is + * not necessary to allocate it, or check for allocation, here. + */ + + value = (char *) ADIOI_Malloc((MPI_MAX_INFO_VAL+1)*sizeof(char)); + ADIOI_BG_assert ((value != NULL)); + + /* initialize info and hints to default values if they haven't been + * previously initialized + */ + if (!fd->hints->initialized) { + + did_anything = 1; + + /* buffer size for collective I/O */ + ADIOI_Info_set(info, "cb_buffer_size", ADIOI_BG_CB_BUFFER_SIZE_DFLT); + fd->hints->cb_buffer_size = atoi(ADIOI_BG_CB_BUFFER_SIZE_DFLT); + + /* default is to let romio automatically decide when to use + * collective buffering + */ + ADIOI_Info_set(info, "romio_cb_read", "enable"); + fd->hints->cb_read = ADIOI_HINT_ENABLE; + ADIOI_Info_set(info, "romio_cb_write", "enable"); + fd->hints->cb_write = ADIOI_HINT_ENABLE; + + if ( fd->hints->cb_config_list != NULL ) ADIOI_Free (fd->hints->cb_config_list); + fd->hints->cb_config_list = NULL; + + /* number of processes that perform I/O in collective I/O */ + MPI_Comm_size(fd->comm, &nprocs); + nprocs_is_valid = 1; + ADIOI_Snprintf(value, MPI_MAX_INFO_VAL+1, "%d", nprocs); + ADIOI_Info_set(info, "cb_nodes", value); + fd->hints->cb_nodes = -1; + + /* hint indicating that no indep. I/O will be performed on this file */ + ADIOI_Info_set(info, "romio_no_indep_rw", "false"); + fd->hints->no_indep_rw = 0; + + /* bg is not implementing file realms (ADIOI_IOStridedColl), + initialize to disabled it. */ + /* hint instructing the use of persistent file realms */ + ADIOI_Info_set(info, "romio_cb_pfr", "disable"); + fd->hints->cb_pfr = ADIOI_HINT_DISABLE; + + /* hint guiding the assignment of persistent file realms */ + ADIOI_Info_set(info, "romio_cb_fr_types", "aar"); + fd->hints->cb_fr_type = ADIOI_FR_AAR; + + /* hint to align file realms with a certain byte value */ + ADIOI_Info_set(info, "romio_cb_fr_alignment", "1"); + fd->hints->cb_fr_alignment = 1; + + /* hint to set a threshold percentage for a datatype's size/extent at + * which data sieving should be done in collective I/O */ + ADIOI_Info_set(info, "romio_cb_ds_threshold", "0"); + fd->hints->cb_ds_threshold = 0; + + /* hint to switch between point-to-point or all-to-all for two-phase */ + ADIOI_Info_set(info, "romio_cb_alltoall", "automatic"); + fd->hints->cb_alltoall = ADIOI_HINT_AUTO; + + /* deferred_open derived from no_indep_rw and cb_{read,write} */ + fd->hints->deferred_open = 0; + + /* buffer size for data sieving in independent reads */ + ADIOI_Info_set(info, "ind_rd_buffer_size", ADIOI_BG_IND_RD_BUFFER_SIZE_DFLT); + fd->hints->ind_rd_buffer_size = atoi(ADIOI_BG_IND_RD_BUFFER_SIZE_DFLT); + + /* buffer size for data sieving in independent writes */ + ADIOI_Info_set(info, "ind_wr_buffer_size", ADIOI_BG_IND_WR_BUFFER_SIZE_DFLT); + fd->hints->ind_wr_buffer_size = atoi(ADIOI_BG_IND_WR_BUFFER_SIZE_DFLT); + + if(fd->file_system == ADIO_UFS) + { + /* default for ufs/pvfs is to disable data sieving */ + ADIOI_Info_set(info, "romio_ds_read", "disable"); + fd->hints->ds_read = ADIOI_HINT_DISABLE; + ADIOI_Info_set(info, "romio_ds_write", "disable"); + fd->hints->ds_write = ADIOI_HINT_DISABLE; + } + else + { + /* default is to let romio automatically decide when to use data + * sieving + */ + ADIOI_Info_set(info, "romio_ds_read", "automatic"); + fd->hints->ds_read = ADIOI_HINT_AUTO; + ADIOI_Info_set(info, "romio_ds_write", "automatic"); + fd->hints->ds_write = ADIOI_HINT_AUTO; + } + + /* still to do: tune this a bit for a variety of file systems. there's + * no good default value so just leave it unset */ + fd->hints->min_fdomain_size = 0; + fd->hints->striping_unit = 0; + + fd->hints->initialized = 1; + } + + /* add in user's info if supplied */ + if (users_info != MPI_INFO_NULL) { + ADIOI_Info_get(users_info, "cb_buffer_size", MPI_MAX_INFO_VAL, + value, &flag); + if (flag && ((intval=atoi(value)) > 0)) { + tmp_val = intval; + + MPI_Bcast(&tmp_val, 1, MPI_INT, 0, fd->comm); + /* --BEGIN ERROR HANDLING-- */ + if (tmp_val != intval) { + MPIO_ERR_CREATE_CODE_INFO_NOT_SAME(myname, + "cb_buffer_size", + error_code); + return; + } + /* --END ERROR HANDLING-- */ + + ADIOI_Info_set(info, "cb_buffer_size", value); + fd->hints->cb_buffer_size = intval; + + } +#if 0 + /* bg is not implementing file realms (ADIOI_IOStridedColl) ... */ + /* aligning file realms to certain sizes (e.g. stripe sizes) + * may benefit I/O performance */ + ADIOI_Info_get(users_info, "romio_cb_fr_alignment", MPI_MAX_INFO_VAL, + value, &flag); + if (flag && ((intval=atoi(value)) > 0)) { + tmp_val = intval; + + MPI_Bcast(&tmp_val, 1, MPI_INT, 0, fd->comm); + /* --BEGIN ERROR HANDLING-- */ + if (tmp_val != intval) { + MPIO_ERR_CREATE_CODE_INFO_NOT_SAME(myname, + "romio_cb_fr_alignment", + error_code); + return; + } + /* --END ERROR HANDLING-- */ + + ADIOI_Info_set(info, "romio_cb_fr_alignment", value); + fd->hints->cb_fr_alignment = intval; + + } + + /* for collective I/O, try to be smarter about when to do data sieving + * using a specific threshold for the datatype size/extent + * (percentage 0-100%) */ + ADIOI_Info_get(users_info, "romio_cb_ds_threshold", MPI_MAX_INFO_VAL, + value, &flag); + if (flag && ((intval=atoi(value)) > 0)) { + tmp_val = intval; + + MPI_Bcast(&tmp_val, 1, MPI_INT, 0, fd->comm); + /* --BEGIN ERROR HANDLING-- */ + if (tmp_val != intval) { + MPIO_ERR_CREATE_CODE_INFO_NOT_SAME(myname, + "romio_cb_ds_threshold", + error_code); + return; + } + /* --END ERROR HANDLING-- */ + + ADIOI_Info_set(info, "romio_cb_ds_threshold", value); + fd->hints->cb_ds_threshold = intval; + + } + ADIOI_Info_get(users_info, "romio_cb_alltoall", MPI_MAX_INFO_VAL, value, + &flag); + if (flag) { + if (!strcmp(value, "enable") || !strcmp(value, "ENABLE")) { + ADIOI_Info_set(info, "romio_cb_alltoall", value); + fd->hints->cb_read = ADIOI_HINT_ENABLE; + } + else if (!strcmp(value, "disable") || !strcmp(value, "DISABLE")) { + ADIOI_Info_set(info, "romio_cb_alltoall", value); + fd->hints->cb_read = ADIOI_HINT_DISABLE; + } + else if (!strcmp(value, "automatic") || !strcmp(value, "AUTOMATIC")) + { + ADIOI_Info_set(info, "romio_cb_alltoall", value); + fd->hints->cb_read = ADIOI_HINT_AUTO; + } + + tmp_val = fd->hints->cb_alltoall; + + MPI_Bcast(&tmp_val, 1, MPI_INT, 0, fd->comm); + /* --BEGIN ERROR HANDLING-- */ + if (tmp_val != fd->hints->cb_alltoall) { + MPIO_ERR_CREATE_CODE_INFO_NOT_SAME(myname, + "romio_cb_alltoall", + error_code); + return; + } + /* --END ERROR HANDLING-- */ + } +#endif + /* new hints for enabling/disabling coll. buffering on + * reads/writes + */ + ADIOI_Info_get(users_info, "romio_cb_read", MPI_MAX_INFO_VAL, value, + &flag); + if (flag) { + if (!strcmp(value, "enable") || !strcmp(value, "ENABLE")) { + ADIOI_Info_set(info, "romio_cb_read", value); + fd->hints->cb_read = ADIOI_HINT_ENABLE; + } + else if (!strcmp(value, "disable") || !strcmp(value, "DISABLE")) { + /* romio_cb_read overrides no_indep_rw */ + ADIOI_Info_set(info, "romio_cb_read", value); + ADIOI_Info_set(info, "romio_no_indep_rw", "false"); + fd->hints->cb_read = ADIOI_HINT_DISABLE; + fd->hints->no_indep_rw = ADIOI_HINT_DISABLE; + } + else if (!strcmp(value, "automatic") || !strcmp(value, "AUTOMATIC")) + { + ADIOI_Info_set(info, "romio_cb_read", value); + fd->hints->cb_read = ADIOI_HINT_AUTO; + } + + tmp_val = fd->hints->cb_read; + + MPI_Bcast(&tmp_val, 1, MPI_INT, 0, fd->comm); + /* --BEGIN ERROR HANDLING-- */ + if (tmp_val != fd->hints->cb_read) { + MPIO_ERR_CREATE_CODE_INFO_NOT_SAME(myname, + "romio_cb_read", + error_code); + return; + } + /* --END ERROR HANDLING-- */ + } + ADIOI_Info_get(users_info, "romio_cb_write", MPI_MAX_INFO_VAL, value, + &flag); + if (flag) { + if (!strcmp(value, "enable") || !strcmp(value, "ENABLE")) { + ADIOI_Info_set(info, "romio_cb_write", value); + fd->hints->cb_write = ADIOI_HINT_ENABLE; + } + else if (!strcmp(value, "disable") || !strcmp(value, "DISABLE")) + { + /* romio_cb_write overrides no_indep_rw, too */ + ADIOI_Info_set(info, "romio_cb_write", value); + ADIOI_Info_set(info, "romio_no_indep_rw", "false"); + fd->hints->cb_write = ADIOI_HINT_DISABLE; + fd->hints->no_indep_rw = ADIOI_HINT_DISABLE; + } + else if (!strcmp(value, "automatic") || + !strcmp(value, "AUTOMATIC")) + { + ADIOI_Info_set(info, "romio_cb_write", value); + fd->hints->cb_write = ADIOI_HINT_AUTO; + } + + tmp_val = fd->hints->cb_write; + + MPI_Bcast(&tmp_val, 1, MPI_INT, 0, fd->comm); + /* --BEGIN ERROR HANDLING-- */ + if (tmp_val != fd->hints->cb_write) { + MPIO_ERR_CREATE_CODE_INFO_NOT_SAME(myname, + "romio_cb_write", + error_code); + return; + } + /* --END ERROR HANDLING-- */ + } + +#if 0 + /* bg is not implementing file realms (ADIOI_IOStridedColl) ... */ + /* enable/disable persistent file realms for collective I/O */ + /* may want to check for no_indep_rdwr hint as well */ + ADIOI_Info_get(users_info, "romio_cb_pfr", MPI_MAX_INFO_VAL, value, + &flag); + if (flag) { + if (!strcmp(value, "enable") || !strcmp(value, "ENABLE")) { + ADIOI_Info_set(info, "romio_cb_pfr", value); + fd->hints->cb_pfr = ADIOI_HINT_ENABLE; + } + else if (!strcmp(value, "disable") || !strcmp(value, "DISABLE")) { + ADIOI_Info_set(info, "romio_cb_pfr", value); + fd->hints->cb_pfr = ADIOI_HINT_DISABLE; + } + else if (!strcmp(value, "automatic") || !strcmp(value, "AUTOMATIC")) + { + ADIOI_Info_set(info, "romio_cb_pfr", value); + fd->hints->cb_pfr = ADIOI_HINT_AUTO; + } + + tmp_val = fd->hints->cb_pfr; + + MPI_Bcast(&tmp_val, 1, MPI_INT, 0, fd->comm); + /* --BEGIN ERROR HANDLING-- */ + if (tmp_val != fd->hints->cb_pfr) { + MPIO_ERR_CREATE_CODE_INFO_NOT_SAME(myname, + "romio_cb_pfr", + error_code); + return; + } + /* --END ERROR HANDLING-- */ + } + + /* file realm assignment types ADIOI_FR_AAR(0), + ADIOI_FR_FSZ(-1), ADIOI_FR_USR_REALMS(-2), all others specify + a regular fr size in bytes. probably not the best way... */ + ADIOI_Info_get(users_info, "romio_cb_fr_type", MPI_MAX_INFO_VAL, + value, &flag); + if (flag && ((intval=atoi(value)) >= -2)) { + tmp_val = intval; + + MPI_Bcast(&tmp_val, 1, MPI_INT, 0, fd->comm); + /* --BEGIN ERROR HANDLING-- */ + if (tmp_val != intval) { + MPIO_ERR_CREATE_CODE_INFO_NOT_SAME(myname, + "romio_cb_fr_type", + error_code); + return; + } + /* --END ERROR HANDLING-- */ + + ADIOI_Info_set(info, "romio_cb_fr_type", value); + fd->hints->cb_fr_type = intval; + + } +#endif + /* new hint for specifying no indep. read/write will be performed */ + ADIOI_Info_get(users_info, "romio_no_indep_rw", MPI_MAX_INFO_VAL, value, + &flag); + if (flag) { + if (!strcmp(value, "true") || !strcmp(value, "TRUE")) { + /* if 'no_indep_rw' set, also hint that we will do + * collective buffering: if we aren't doing independent io, + * then we have to do collective */ + ADIOI_Info_set(info, "romio_no_indep_rw", value); + ADIOI_Info_set(info, "romio_cb_write", "enable"); + ADIOI_Info_set(info, "romio_cb_read", "enable"); + fd->hints->no_indep_rw = 1; + fd->hints->cb_read = 1; + fd->hints->cb_write = 1; + tmp_val = 1; + } + else if (!strcmp(value, "false") || !strcmp(value, "FALSE")) { + ADIOI_Info_set(info, "romio_no_indep_rw", value); + fd->hints->no_indep_rw = 0; + tmp_val = 0; + } + else { + /* default is above */ + tmp_val = 0; + } + + MPI_Bcast(&tmp_val, 1, MPI_INT, 0, fd->comm); + /* --BEGIN ERROR HANDLING-- */ + if (tmp_val != fd->hints->no_indep_rw) { + MPIO_ERR_CREATE_CODE_INFO_NOT_SAME(myname, + "romio_no_indep_rw", + error_code); + return; + } + /* --END ERROR HANDLING-- */ + } + /* new hints for enabling/disabling data sieving on + * reads/writes + */ + ADIOI_Info_get(users_info, "romio_ds_read", MPI_MAX_INFO_VAL, value, + &flag); + if (flag) { + if (!strcmp(value, "enable") || !strcmp(value, "ENABLE")) { + ADIOI_Info_set(info, "romio_ds_read", value); + fd->hints->ds_read = ADIOI_HINT_ENABLE; + } + else if (!strcmp(value, "disable") || !strcmp(value, "DISABLE")) { + ADIOI_Info_set(info, "romio_ds_read", value); + fd->hints->ds_read = ADIOI_HINT_DISABLE; + } + else if (!strcmp(value, "automatic") || !strcmp(value, "AUTOMATIC")) + { + ADIOI_Info_set(info, "romio_ds_read", value); + fd->hints->ds_read = ADIOI_HINT_AUTO; + } + /* otherwise ignore */ + } + ADIOI_Info_get(users_info, "romio_ds_write", MPI_MAX_INFO_VAL, value, + &flag); + if (flag) { + if (!strcmp(value, "enable") || !strcmp(value, "ENABLE")) { + ADIOI_Info_set(info, "romio_ds_write", value); + fd->hints->ds_write = ADIOI_HINT_ENABLE; + } + else if (!strcmp(value, "disable") || !strcmp(value, "DISABLE")) { + ADIOI_Info_set(info, "romio_ds_write", value); + fd->hints->ds_write = ADIOI_HINT_DISABLE; + } + else if (!strcmp(value, "automatic") || !strcmp(value, "AUTOMATIC")) + { + ADIOI_Info_set(info, "romio_ds_write", value); + fd->hints->ds_write = ADIOI_HINT_AUTO; + } + /* otherwise ignore */ + } + + ADIOI_Info_get(users_info, "ind_wr_buffer_size", MPI_MAX_INFO_VAL, + value, &flag); + if (flag && ((intval = atoi(value)) > 0)) { + ADIOI_Info_set(info, "ind_wr_buffer_size", value); + fd->hints->ind_wr_buffer_size = intval; + } + + ADIOI_Info_get(users_info, "ind_rd_buffer_size", MPI_MAX_INFO_VAL, + value, &flag); + if (flag && ((intval = atoi(value)) > 0)) { + ADIOI_Info_set(info, "ind_rd_buffer_size", value); + fd->hints->ind_rd_buffer_size = intval; + } + + memset( value, 0, MPI_MAX_INFO_VAL+1 ); + ADIOI_Info_get(users_info, "romio_min_fdomain_size", MPI_MAX_INFO_VAL, + value, &flag); + if ( flag && ((intval = atoi(value)) > 0) ) { + ADIOI_Info_set(info, "romio_min_fdomain_size", value); + fd->hints->min_fdomain_size = intval; + } + /* Now we use striping unit in common code so we should + process hints for it. */ + ADIOI_Info_get(users_info, "striping_unit", MPI_MAX_INFO_VAL, + value, &flag); + if ( flag && ((intval = atoi(value)) > 0) ) { + ADIOI_Info_set(info, "striping_unit", value); + fd->hints->striping_unit = intval; + } + + memset( value, 0, MPI_MAX_INFO_VAL+1 ); + ADIOI_Info_get(users_info, ADIOI_BG_NAGG_IN_PSET_HINT_NAME, MPI_MAX_INFO_VAL, + value, &flag); + if (flag && ((intval = atoi(value)) > 0)) { + + did_anything = 1; + ADIOI_Info_set(info, ADIOI_BG_NAGG_IN_PSET_HINT_NAME, value); + fd->hints->cb_nodes = intval; + } + } + + /* associate CB aggregators to certain CNs in every involved PSET */ + if (did_anything) { + ADIOI_BG_gen_agg_ranklist(fd, fd->hints->cb_nodes); + } + /* ignore defered open hints and do not enable it for bluegene: need all + * processors in the open path so we can stat-and-broadcast the blocksize + */ + ADIOI_Info_set(info, "romio_no_indep_rw", "false"); + fd->hints->no_indep_rw = 0; + fd->hints->deferred_open = 0; + + /* BobC commented this out, but since hint processing runs on both bg and + * bglockless, we need to keep DS writes enabled on gpfs and disabled on + * PVFS */ + if (ADIO_Feature(fd, ADIO_DATA_SIEVING_WRITES) == 0) { + /* disable data sieving for fs that do not + support file locking */ + ADIOI_Info_get(info, "ind_wr_buffer_size", MPI_MAX_INFO_VAL, + value, &flag); + if (flag) { + /* get rid of this value if it is set */ + ADIOI_Info_delete(info, "ind_wr_buffer_size"); + } + /* note: leave ind_wr_buffer_size alone; used for other cases + * as well. -- Rob Ross, 04/22/2003 + */ + ADIOI_Info_set(info, "romio_ds_write", "disable"); + fd->hints->ds_write = ADIOI_HINT_DISABLE; + } + + ADIOI_Free(value); + + *error_code = MPI_SUCCESS; +} diff --git a/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_open.c b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_open.c new file mode 100644 index 0000000000..70e7db2ee3 --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_open.c @@ -0,0 +1,307 @@ +/* ---------------------------------------------------------------- */ +/* (C)Copyright IBM Corp. 2007, 2008 */ +/* ---------------------------------------------------------------- */ +/** + * \file ad_bg_open.c + * \brief ??? + */ + +/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* + * Copyright (C) 1997 University of Chicago. + * See COPYRIGHT notice in top-level directory. + */ + +#include "ad_bg.h" +#include "ad_bg_aggrs.h" + +#include +#include + +/* COPIED FROM ad_fstype.c since it is static in that file + + ADIO_FileSysType_parentdir - determines a string pathname for the + parent directory of a given filename. + +Input Parameters: +. filename - pointer to file name character array + +Output Parameters: +. dirnamep - pointer to location in which to store a pointer to a string + + Note that the caller should free the memory located at the pointer returned + after the string is no longer needed. +*/ + +#ifndef PATH_MAX +#define PATH_MAX 65535 +#endif + +/* In a strict ANSI environment, S_ISLNK may not be defined. Fix that + here. We assume that S_ISLNK is *always* defined as a macro. If + that is not universally true, then add a test to the romio + configure that trys to link a program that references S_ISLNK */ +#if !defined(S_ISLNK) +# if defined(S_IFLNK) + /* Check for the link bit */ +# define S_ISLNK(mode) ((mode) & S_IFLNK) +# else + /* no way to check if it is a link, so say false */ +# define S_ISLNK(mode) 0 +# endif +#endif /* !(S_ISLNK) */ + +/* ADIO_FileSysType_parentdir + * + * Returns pointer to string in dirnamep; that string is allocated with + * strdup and must be free()'d. + */ +static void ADIO_FileSysType_parentdir(char *filename, char **dirnamep) +{ + int err; + char *dir = NULL, *slash; + struct stat statbuf; + + err = lstat(filename, &statbuf); + + if (err || (!S_ISLNK(statbuf.st_mode))) { + /* no such file, or file is not a link; these are the "normal" + * cases where we can just return the parent directory. + */ + dir = ADIOI_Strdup(filename); + } + else { + /* filename is a symlink. we've presumably already tried + * to stat it and found it to be missing (dangling link), + * but this code doesn't care if the target is really there + * or not. + */ + int namelen; + char *linkbuf; + + linkbuf = ADIOI_Malloc(PATH_MAX+1); + namelen = readlink(filename, linkbuf, PATH_MAX+1); + if (namelen == -1) { + /* something strange has happened between the time that + * we determined that this was a link and the time that + * we attempted to read it; punt and use the old name. + */ + dir = ADIOI_Strdup(filename); + } + else { + /* successfully read the link */ + linkbuf[namelen] = '\0'; /* readlink doesn't null terminate */ + dir = ADIOI_Strdup(linkbuf); + ADIOI_Free(linkbuf); + } + } + + slash = strrchr(dir, '/'); + if (!slash) ADIOI_Strncpy(dir, ".", 2); + else { + if (slash == dir) *(dir + 1) = '\0'; + else *slash = '\0'; + } + + *dirnamep = dir; + return; +} + +static void scaleable_stat(ADIO_File fd) +{ + struct stat64 bg_stat; + struct statfs bg_statfs; + int rank, rc; + char * dir; + long buf[2]; + MPI_Comm_rank(fd->comm, &rank); + + if (rank == 0) { + /* Get the (real) underlying file system block size */ + rc = stat64(fd->filename, &bg_stat); + if (rc >= 0) + { + buf[0] = bg_stat.st_blksize; + DBGV_FPRINTF(stderr,"Successful stat '%s'. Blocksize=%ld\n", + fd->filename,bg_stat.st_blksize); + } + else + { + DBGV_FPRINTF(stderr,"Stat '%s' failed with rc=%d, errno=%d\n", + fd->filename,rc,errno); + } + /* Get the (real) underlying file system type so we can + * plan our fsync scaling strategy */ + rc = statfs(fd->filename,&bg_statfs); + if (rc >= 0) + { + DBGV_FPRINTF(stderr,"Successful statfs '%s'. Magic number=%#lX\n", + fd->filename,bg_statfs.f_type); + buf[1] = bg_statfs.f_type; + } + else + { + DBGV_FPRINTF(stderr,"Statfs '%s' failed with rc=%d, errno=%d\n", + fd->filename,rc,errno); + ADIO_FileSysType_parentdir(fd->filename, &dir); + rc = statfs(dir,&bg_statfs); + if (rc >= 0) + { + DBGV_FPRINTF(stderr,"Successful statfs '%s'. Magic number=%#lX\n",dir,bg_statfs.f_type); + buf[1] = bg_statfs.f_type; + } + else + { + /* Hmm. Guess we'll assume the worst-case, that it's not GPFS + * or BGLOCKLESSMPIO_F_TYPE (default PVFS2) below */ + buf[1] = -1; /* bogus magic number */ + DBGV_FPRINTF(stderr,"Statfs '%s' failed with rc=%d, errno=%d\n",dir,rc,errno); + } + free(dir); + } + } + /* now we can broadcast the stat/statfs data to everyone else */ + MPI_Bcast(buf, 2, MPI_LONG, 0, fd->comm); + bg_stat.st_blksize = buf[0]; + bg_statfs.f_type = buf[1]; + + /* data from stat64 */ + /* store the blksize in the file system specific storage */ + ((ADIOI_BG_fs*)fd->fs_ptr)->blksize = bg_stat.st_blksize; + + /* data from statfs */ + if ((bg_statfs.f_type == GPFS_SUPER_MAGIC) || + (bg_statfs.f_type == bglocklessmpio_f_type)) + { + ((ADIOI_BG_fs*)fd->fs_ptr)->fsync_aggr = + ADIOI_BG_FSYNC_AGGREGATION_ENABLED; + + /* Only one rank is an "fsync aggregator" because only one + * fsync is needed */ + if (rank == 0) + { + ((ADIOI_BG_fs*)fd->fs_ptr)->fsync_aggr |= + ADIOI_BG_FSYNC_AGGREGATOR; + DBG_FPRINTF(stderr,"fsync aggregator %d\n",rank); + } + else + ; /* aggregation enabled but this rank is not an aggregator*/ + } + else + ; /* Other filesystems default to no fsync aggregation */ +} + + +void ADIOI_BG_Open(ADIO_File fd, int *error_code) +{ + int perm, old_mask, amode; + static char myname[] = "ADIOI_BG_OPEN"; + + /* set internal variables for tuning environment variables */ + ad_bg_get_env_vars(); + + if (fd->perm == ADIO_PERM_NULL) { + old_mask = umask(022); + umask(old_mask); + perm = old_mask ^ 0666; + } + else perm = fd->perm; + + amode = 0; + if (fd->access_mode & ADIO_CREATE) + amode = amode | O_CREAT; + if (fd->access_mode & ADIO_RDONLY) + amode = amode | O_RDONLY; + if (fd->access_mode & ADIO_WRONLY) + amode = amode | O_WRONLY; + if (fd->access_mode & ADIO_RDWR) + amode = amode | O_RDWR; + if (fd->access_mode & ADIO_EXCL) + amode = amode | O_EXCL; +#ifdef ADIOI_MPE_LOGGING + MPE_Log_event(ADIOI_MPE_open_a, 0, NULL); +#endif + fd->fd_sys = open(fd->filename, amode, perm); +#ifdef ADIOI_MPE_LOGGING + MPE_Log_event(ADIOI_MPE_open_b, 0, NULL); +#endif + DBG_FPRINTF(stderr,"open('%s',%#X,%#X) rc=%d, errno=%d\n",fd->filename,amode,perm,fd->fd_sys,errno); + fd->fd_direct = -1; + + if ((fd->fd_sys != -1) && (fd->access_mode & ADIO_APPEND)) + fd->fp_ind = fd->fp_sys_posn = lseek(fd->fd_sys, 0, SEEK_END); + + if(fd->fd_sys != -1) + { + + /* Initialize the ad_bg file system specific information */ + ADIOI_BG_assert(fd->fs_ptr == NULL); + fd->fs_ptr = (ADIOI_BG_fs*) ADIOI_Malloc(sizeof(ADIOI_BG_fs)); + + ((ADIOI_BG_fs*)fd->fs_ptr)->blksize = 1048576; /* default to 1M */ + + /* default is no fsync aggregation */ + ((ADIOI_BG_fs*)fd->fs_ptr)->fsync_aggr = + ADIOI_BG_FSYNC_AGGREGATION_DISABLED; + + +#ifdef ADIOI_MPE_LOGGING + MPE_Log_event(ADIOI_MPE_stat_a, 0, NULL); +#endif + scaleable_stat(fd); +#ifdef ADIOI_MPE_LOGGING + MPE_Log_event(ADIOI_MPE_stat_b, 0, NULL); +#endif + } + + if (fd->fd_sys == -1) { + if (errno == ENAMETOOLONG) + *error_code = MPIO_Err_create_code(MPI_SUCCESS, + MPIR_ERR_RECOVERABLE, myname, + __LINE__, MPI_ERR_BAD_FILE, + "**filenamelong", + "**filenamelong %s %d", + fd->filename, + strlen(fd->filename)); + else if (errno == ENOENT) + *error_code = MPIO_Err_create_code(MPI_SUCCESS, + MPIR_ERR_RECOVERABLE, myname, + __LINE__, MPI_ERR_NO_SUCH_FILE, + "**filenoexist", + "**filenoexist %s", + fd->filename); + else if (errno == ENOTDIR || errno == ELOOP) + *error_code = MPIO_Err_create_code(MPI_SUCCESS, + MPIR_ERR_RECOVERABLE, + myname, __LINE__, + MPI_ERR_BAD_FILE, + "**filenamedir", + "**filenamedir %s", + fd->filename); + else if (errno == EACCES) { + *error_code = MPIO_Err_create_code(MPI_SUCCESS, + MPIR_ERR_RECOVERABLE, myname, + __LINE__, MPI_ERR_ACCESS, + "**fileaccess", + "**fileaccess %s", + fd->filename ); + } + else if (errno == EROFS) { + /* Read only file or file system and write access requested */ + *error_code = MPIO_Err_create_code(MPI_SUCCESS, + MPIR_ERR_RECOVERABLE, myname, + __LINE__, MPI_ERR_READ_ONLY, + "**ioneedrd", 0 ); + } + else { + *error_code = MPIO_Err_create_code(MPI_SUCCESS, + MPIR_ERR_RECOVERABLE, myname, + __LINE__, MPI_ERR_IO, "**io", + "**io %s", strerror(errno)); + } + } + else *error_code = MPI_SUCCESS; +} +/* + *vim: ts=8 sts=4 sw=4 noexpandtab + */ diff --git a/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_pset.c b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_pset.c new file mode 100644 index 0000000000..bb4186693e --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_pset.c @@ -0,0 +1,279 @@ +/* ---------------------------------------------------------------- */ +/* (C)Copyright IBM Corp. 2007, 2008 */ +/* ---------------------------------------------------------------- */ +/** + * \file ad_bg_pset.c + * \brief Definition of functions associated to structs ADIOI_BG_ProcInfo_t and ADIOI_BG_ConfInfo_t + */ + +/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* + * Copyright (C) 1997 University of Chicago. + * See COPYRIGHT notice in top-level directory. + */ + +/* #define TRACE_ON */ +#include +#include "ad_bg.h" +#include "ad_bg_pset.h" +#include "mpidimpl.h" +#include + + +ADIOI_BG_ProcInfo_t * +ADIOI_BG_ProcInfo_new() +{ + ADIOI_BG_ProcInfo_t *p = (ADIOI_BG_ProcInfo_t *) ADIOI_Malloc (sizeof(ADIOI_BG_ProcInfo_t)); + ADIOI_BG_assert ((p != NULL)); + return p; +} + +ADIOI_BG_ProcInfo_t * +ADIOI_BG_ProcInfo_new_n( int n ) +{ + ADIOI_BG_ProcInfo_t *p = (ADIOI_BG_ProcInfo_t *) ADIOI_Malloc (n * sizeof(ADIOI_BG_ProcInfo_t)); + ADIOI_BG_assert ((p != NULL)); + return p; +} + +void +ADIOI_BG_ProcInfo_free( ADIOI_BG_ProcInfo_t *info ) +{ + if (info != NULL) ADIOI_Free (info); +} + +ADIOI_BG_ConfInfo_t * +ADIOI_BG_ConfInfo_new () +{ + ADIOI_BG_ConfInfo_t *p = (ADIOI_BG_ConfInfo_t *) ADIOI_Malloc (sizeof(ADIOI_BG_ConfInfo_t)); + ADIOI_BG_assert ((p != NULL)); + return p; +} + + +void +ADIOI_BG_ConfInfo_free( ADIOI_BG_ConfInfo_t *info ) +{ + if (info != NULL) ADIOI_Free (info); +} + + +typedef struct +{ + int rank; + int bridgeCoord; +} sortstruct; + +static int intsort(const void *p1, const void *p2) +{ + sortstruct *i1, *i2; + i1 = (sortstruct *)p1; + i2 = (sortstruct *)p2; + return(i1->bridgeCoord - i2->bridgeCoord); +} + + +void +ADIOI_BG_persInfo_init(ADIOI_BG_ConfInfo_t *conf, + ADIOI_BG_ProcInfo_t *proc, + int size, int rank, int n_aggrs, MPI_Comm comm) +{ + int i, iambridge=0, bridgerank = -1, bridgeIndex; + int countPset; + sortstruct *bridges; + int commsize; + + TRACE_ERR("Entering BG_persInfo_init, size: %d, rank: %d, n_aggrs: %d, comm: %d\n", size, rank, n_aggrs, (int)comm); + + Personality_t pers; + MPIX_Hardware_t hw; + MPIX_Hardware(&hw); + TRACE_ERR("BG_persInfo_init, my coords{%u,%u,%u,%u,%u} rankInPset %u,sizeOfPset %u,idOfPset %u\n",hw.Coords[0],hw.Coords[1],hw.Coords[2],hw.Coords[3],hw.Coords[4],hw.rankInPset,hw.sizeOfPset,hw.idOfPset); + + + Kernel_GetPersonality(&pers, sizeof(pers)); + + proc->rank = rank; + proc->coreID = hw.coreID; + MPI_Comm_size(comm, &commsize); + + if(size == 1) + { + proc->iamBridge = 1; + + /* Set up the other parameters */ + proc->myIOSize = size; + proc->ioNodeIndex = 0; + conf->ioMinSize = size; + conf->ioMaxSize = size; + conf->numBridgeRanks = 1; + conf->nProcs = size; + conf->cpuIDsize = hw.ppn; + /*conf->virtualPsetSize = conf->ioMaxSize * conf->cpuIDsize;*/ + conf->nAggrs = 1; + conf->aggRatio = 1. * conf->nAggrs / conf->ioMaxSize /*virtualPsetSize*/; + if(conf->aggRatio > 1) conf->aggRatio = 1.; + TRACE_ERR("I am (single) Bridge rank\n"); + return; + } + + /* Find the nearest bridge node coords. We don't know the + rank in our comm so we will collective find/pick a bridge + rank later. + */ + int32_t bridgeCoords; + bridgeCoords = pers.Network_Config.cnBridge_A << 24 | + pers.Network_Config.cnBridge_B << 18 | + pers.Network_Config.cnBridge_C << 12 | + pers.Network_Config.cnBridge_D << 6 | + pers.Network_Config.cnBridge_E << 2; + ADIOI_BG_assert((bridgeCoords >= 0)); /* A dim is < 6 bits or sorting won't work */ + + if((hw.Coords[0] == pers.Network_Config.cnBridge_A) && + (hw.Coords[1] == pers.Network_Config.cnBridge_B) && + (hw.Coords[2] == pers.Network_Config.cnBridge_C) && + (hw.Coords[3] == pers.Network_Config.cnBridge_D) && + (hw.Coords[4] == pers.Network_Config.cnBridge_E)) + iambridge = 1; /* I am bridge */ + + TRACE_ERR("Bridge coords(%8.8X): %d %d %d %d %d, %d. iambridge %d\n",bridgeCoords, pers.Network_Config.cnBridge_A,pers.Network_Config.cnBridge_B,pers.Network_Config.cnBridge_C,pers.Network_Config.cnBridge_D,pers.Network_Config.cnBridge_E,0, iambridge); + + /* Allgather the ranks and bridgeCoords to determine the bridge + rank and how many ranks belong to each bridge rank*/ + bridges = (sortstruct *) ADIOI_Malloc(sizeof(sortstruct) * size); + + /* We're going to sort this structure by bridgeCoord: + + typedef struct + { + int rank; + int bridgeCoord; + } sortstruct; + + and I want the rank that IS the bridge to sort first, so + OR in '1' on non-bridge ranks that use a bridge coord. + */ + + /* My input to the collective */ + bridges[rank].rank = rank; + bridges[rank].bridgeCoord = bridgeCoords; + if(!iambridge) + bridges[rank].bridgeCoord |= 1; /* I am not bridge, turn on bit */ + + + MPI_Allgather(MPI_IN_PLACE, 2, MPI_INT, bridges, 2, MPI_INT, comm); + + qsort(bridges, size, sizeof(sortstruct), intsort); + + /* Once the list is sorted walk through it to setup bridge + info and find bridge ranks, etc. */ + + int tempCoords, tempRank, mincompute, maxcompute; + tempCoords = bridges[0].bridgeCoord & ~1; + tempRank = bridges[0].rank; + + countPset=1; + bridgeIndex = 0; + mincompute = size+1; + maxcompute = 1; + + for(i=1; i maxcompute) + maxcompute = countPset; + if(countPset < mincompute) + mincompute = countPset; + + /* Is this my bridge? */ + if(tempCoords == bridgeCoords) + { + /* Am I the bridge rank? */ + if(tempRank == rank) + iambridge = 1; + else + iambridge = 0; /* Another rank on my node may have taken over */ + TRACE_ERR("Rank %u, bridge set %u, bridge rank %d (%#8.8X) has %d ranks, iambridge %u\n", + rank, bridgeIndex, tempRank, tempCoords, countPset,iambridge); + bridgerank = tempRank; + proc->myIOSize = countPset; + proc->ioNodeIndex = bridgeIndex; + } + tempCoords = bridges[i].bridgeCoord & ~1; + tempRank = bridges[i].rank; + bridgeIndex++; + countPset = 1; + } + } + /* Process last bridge */ + +#ifdef TRACE_ON + if(rank == 0) + TRACE_ERR("Bridge set %u, bridge rank %d (%#8.8X) has %d ranks\n", + bridgeIndex, tempRank, tempCoords, countPset); +#endif + if(countPset > maxcompute) + maxcompute = countPset; + if(countPset < mincompute) + mincompute = countPset; + + /* Is this my bridge? */ + if(tempCoords == bridgeCoords) + { + /* Am I the bridge rank? */ + if(tempRank == rank) + iambridge = 1; + else + iambridge = 0; /* Another rank on my node may have taken over */ + bridgerank = tempRank; + proc->myIOSize = countPset; + proc->ioNodeIndex = bridgeIndex; + } + + + if(rank == 0) + { + /* Only rank 0 has a conf structure, fill in stuff as appropriate */ + conf->ioMinSize = mincompute; + conf->ioMaxSize = maxcompute; /* equivalent to pset size */ + conf->numBridgeRanks = bridgeIndex+1; + conf->nProcs = size; + conf->cpuIDsize = hw.ppn; + /*conf->virtualPsetSize = maxcompute * conf->cpuIDsize;*/ + + conf->nAggrs = n_aggrs; + /* First pass gets nAggrs = -1 */ + if(conf->nAggrs <=0 || + MIN(conf->nProcs, conf->ioMaxSize /*virtualPsetSize*/) < conf->nAggrs) + conf->nAggrs = ADIOI_BG_NAGG_PSET_DFLT; + if(conf->nAggrs > conf->numBridgeRanks) /* maybe? * conf->cpuIDsize) */ + conf->nAggrs = conf->numBridgeRanks; /* * conf->cpuIDsize; */ + + conf->aggRatio = 1. * conf->nAggrs / conf->ioMaxSize /*virtualPsetSize*/; + if(conf->aggRatio > 1) conf->aggRatio = 1.; + TRACE_ERR("Maximum ranks under a bridge rank: %d, minimum: %d, nAggrs: %d, vps: %d, numBridgeRanks: %d pset dflt: %d naggrs: %d ratio: %f\n", maxcompute, mincompute, conf->nAggrs, conf->ioMaxSize /*virtualPsetSize*/, conf->numBridgeRanks, ADIOI_BG_NAGG_PSET_DFLT, conf->nAggrs, conf->aggRatio); + } + + ADIOI_BG_assert((bridgerank != -1)); + proc->bridgeRank = bridgerank; + proc->iamBridge = iambridge; + TRACE_ERR("Rank %d has bridge set index %d (bridge rank: %d) with %d other ranks, ioNodeIndex: %d\n", rank, proc->ioNodeIndex, bridgerank, proc->myIOSize, proc->ioNodeIndex); + + ADIOI_Free(bridges); + +} + +void +ADIOI_BG_persInfo_free( ADIOI_BG_ConfInfo_t *conf, ADIOI_BG_ProcInfo_t *proc ) +{ + ADIOI_BG_ConfInfo_free( conf ); + ADIOI_BG_ProcInfo_free( proc ); +} diff --git a/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_pset.h b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_pset.h new file mode 100644 index 0000000000..7ad832e387 --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_pset.h @@ -0,0 +1,81 @@ +/* ---------------------------------------------------------------- */ +/* (C)Copyright IBM Corp. 2007, 2008 */ +/* ---------------------------------------------------------------- */ +/** + * \file ad_bg_pset.h + * \brief ??? + */ + +/* File: ad_bg_pset.h + * + * Defines two structures that keep BG/L PSET specific information and their public interfaces: + * . ADIOI_BG_ProcInfo_t object keeps specific information to each process + * . ADIOI_BG_ConfInfo_t object keeps general information for the whole communicator, only kept + * on process 0. + */ + +#ifndef AD_BG_PSET_H_ +#define AD_BG_PSET_H_ + +/* Keeps specific information to each process, will be exchanged among processes */ +typedef struct { + int ioNodeIndex; /* similar to psetNum on BGL/BGP */ + int rank; /* my rank */ +/* int myCoords[5]; */ + int bridgeRank; /* my bridge node (or proxy) rank */ + unsigned char coreID; + unsigned char threadID; /* unlikely to be useful but better than just padding */ + unsigned char __cpad[2]; + int myIOSize; /* number of ranks sharing my bridge/IO + node, i.e. psetsize*/ + int iamBridge; /* am *I* the bridge rank? */ + int __ipad[2]; +} ADIOI_BG_ProcInfo_t __attribute__((aligned(16))); + +/* Keeps general information for the whole communicator, only on process 0 */ +typedef struct { + int ioMinSize; /* Smallest number of ranks shareing 1 bridge node */ + int ioMaxSize; /* Largest number of ranks sharing 1 bridge node */ + /* ioMaxSize will be the "psetsize" */ + int nAggrs; + int numBridgeRanks; + /*int virtualPsetSize; ppn * pset size */ + int nProcs; + int cpuIDsize; /* num ppn */ + float aggRatio; + +} ADIOI_BG_ConfInfo_t __attribute__((aligned(16))); + + +#undef MIN +#define MIN(a,b) ((ahints->cb_pfr != ADIOI_HINT_DISABLE) { + ADIOI_IOStridedColl (fd, buf, count, ADIOI_READ, datatype, + file_ptr_type, offset, status, error_code); + return; + } */ +#endif +#ifdef PROFILE + MPE_Log_event(13, 0, "start computation"); +#endif + + MPI_Comm_size(fd->comm, &nprocs); + MPI_Comm_rank(fd->comm, &myrank); + + /* number of aggregators, cb_nodes, is stored in the hints */ + nprocs_for_coll = fd->hints->cb_nodes; + orig_fp = fd->fp_ind; + +#if BG_PROFILE + BGMPIO_T_CIO_SET_GET( 0, r, 0, 1, 0, BGMPIO_CIO_LCOMP, BGMPIO_CIO_LAST ) +#endif + + /* only check for interleaving if cb_read isn't disabled */ + if (fd->hints->cb_read != ADIOI_HINT_DISABLE) { + /* For this process's request, calculate the list of offsets and + lengths in the file and determine the start and end offsets. */ + + /* Note: end_offset points to the last byte-offset that will be accessed. + e.g., if start_offset=0 and 100 bytes to be read, end_offset=99*/ + + ADIOI_Calc_my_off_len(fd, count, datatype, file_ptr_type, offset, + &offset_list, &len_list, &start_offset, + &end_offset, &contig_access_count); + +#if BG_PROFILE + BGMPIO_T_CIO_SET_GET( 0, r, 1, 1, 1, BGMPIO_CIO_GATHER, BGMPIO_CIO_LCOMP ) +#endif + +#ifdef RDCOLL_DEBUG + for (i=0; icomm ); + + for (ii=0; iicomm); + MPI_Allgather(&end_offset, 1, ADIO_OFFSET, end_offsets, 1, + ADIO_OFFSET, fd->comm); + } + +#if BG_PROFILE + BGMPIO_T_CIO_SET_GET( 0, r, 0, 1, 1, BGMPIO_CIO_PATANA, BGMPIO_CIO_GATHER ) +#endif + + /* are the accesses of different processes interleaved? */ + for (i=1; ihints->cb_read == ADIOI_HINT_DISABLE + || (!interleave_count && (fd->hints->cb_read == ADIOI_HINT_AUTO))) + { + /* don't do aggregation */ + if (fd->hints->cb_read != ADIOI_HINT_DISABLE) { + ADIOI_Free(offset_list); + ADIOI_Free(len_list); + ADIOI_Free(st_offsets); + ADIOI_Free(end_offsets); + } + + fd->fp_ind = orig_fp; + ADIOI_Datatype_iscontig(fd->filetype, &filetype_is_contig); + + if (buftype_is_contig && filetype_is_contig) { + if (file_ptr_type == ADIO_EXPLICIT_OFFSET) { + off = fd->disp + (ADIO_Offset)(fd->etype_size) * offset; + ADIO_ReadContig(fd, buf, count, datatype, ADIO_EXPLICIT_OFFSET, + off, status, error_code); + } + else ADIO_ReadContig(fd, buf, count, datatype, ADIO_INDIVIDUAL, + 0, status, error_code); + } + else ADIO_ReadStrided(fd, buf, count, datatype, file_ptr_type, + offset, status, error_code); + + return; + } + +#if BG_PROFILE + BGMPIO_T_CIO_SET_GET( 0, r, 1, 1, 1, BGMPIO_CIO_FD_PART, BGMPIO_CIO_PATANA ) +#endif + + /* We're going to perform aggregation of I/O. Here we call + * ADIOI_Calc_file_domains() to determine what processes will handle I/O + * to what regions. We pass nprocs_for_coll into this function; it is + * used to determine how many processes will perform I/O, which is also + * the number of regions into which the range of bytes must be divided. + * These regions are called "file domains", or FDs. + * + * When this function returns, fd_start, fd_end, fd_size, and + * min_st_offset will be filled in. fd_start holds the starting byte + * location for each file domain. fd_end holds the ending byte location. + * min_st_offset holds the minimum byte location that will be accessed. + * + * Both fd_start[] and fd_end[] are indexed by an aggregator number; this + * needs to be mapped to an actual rank in the communicator later. + * + */ + if (bgmpio_tuneblocking) + ADIOI_BG_GPFS_Calc_file_domains(st_offsets, end_offsets, nprocs, + nprocs_for_coll, &min_st_offset, + &fd_start, &fd_end, &fd_size, fd->fs_ptr); + else + ADIOI_Calc_file_domains(st_offsets, end_offsets, nprocs, + nprocs_for_coll, &min_st_offset, + &fd_start, &fd_end, + fd->hints->min_fdomain_size, &fd_size, + fd->hints->striping_unit); + +#if BG_PROFILE + BGMPIO_T_CIO_SET_GET( 0, r, 0, 1, 1, BGMPIO_CIO_MYREQ, BGMPIO_CIO_FD_PART ) +#endif + + /* calculate where the portions of the access requests of this process + * are located in terms of the file domains. this could be on the same + * process or on other processes. this function fills in: + * count_my_req_procs - number of processes (including this one) for which + * this process has requests in their file domain + * count_my_req_per_proc - count of requests for each process, indexed + * by rank of the process + * my_req[] - array of data structures describing the requests to be + * performed by each process (including self). indexed by rank. + * buf_idx[] - array of locations into which data can be directly moved; + * this is only valid for contiguous buffer case + */ + if (bgmpio_tuneblocking) + ADIOI_BG_Calc_my_req(fd, offset_list, len_list, contig_access_count, + min_st_offset, fd_start, fd_end, fd_size, + nprocs, &count_my_req_procs, + &count_my_req_per_proc, &my_req, + &buf_idx); + else + ADIOI_Calc_my_req(fd, offset_list, len_list, contig_access_count, + min_st_offset, fd_start, fd_end, fd_size, + nprocs, &count_my_req_procs, + &count_my_req_per_proc, &my_req, + &buf_idx); + +#if BG_PROFILE + BGMPIO_T_CIO_SET_GET( 0, r, 1, 1, 1, BGMPIO_CIO_OTHREQ, BGMPIO_CIO_MYREQ ) +#endif + + /* perform a collective communication in order to distribute the + * data calculated above. fills in the following: + * count_others_req_procs - number of processes (including this + * one) which have requests in this process's file domain. + * count_others_req_per_proc[] - number of separate contiguous + * requests from proc i lie in this process's file domain. + */ + if (bgmpio_tuneblocking) + ADIOI_BG_Calc_others_req(fd, count_my_req_procs, + count_my_req_per_proc, my_req, + nprocs, myrank, &count_others_req_procs, + &others_req); + + else + ADIOI_Calc_others_req(fd, count_my_req_procs, + count_my_req_per_proc, my_req, + nprocs, myrank, &count_others_req_procs, + &others_req); + +#if BG_PROFILE + BGMPIO_T_CIO_SET_GET( 0, r, 1, 1, 1, BGMPIO_CIO_DEXCH, BGMPIO_CIO_OTHREQ ) +#endif + + /* my_req[] and count_my_req_per_proc aren't needed at this point, so + * let's free the memory + */ + ADIOI_Free(count_my_req_per_proc); + for (i=0; ifp_sys_posn = -1; /* set it to null. */ +} + +static void ADIOI_Read_and_exch(ADIO_File fd, void *buf, MPI_Datatype + datatype, int nprocs, + int myrank, ADIOI_Access + *others_req, ADIO_Offset *offset_list, + ADIO_Offset *len_list, int contig_access_count, ADIO_Offset + min_st_offset, ADIO_Offset fd_size, + ADIO_Offset *fd_start, ADIO_Offset *fd_end, + int *buf_idx, int *error_code) +{ +/* Read in sizes of no more than coll_bufsize, an info parameter. + Send data to appropriate processes. + Place recd. data in user buf. + The idea is to reduce the amount of extra memory required for + collective I/O. If all data were read all at once, which is much + easier, it would require temp space more than the size of user_buf, + which is often unacceptable. For example, to read a distributed + array from a file, where each local array is 8Mbytes, requiring + at least another 8Mbytes of temp space is unacceptable. */ + + int i, j, m, ntimes, max_ntimes, buftype_is_contig; + ADIO_Offset st_loc=-1, end_loc=-1, off, done, real_off, req_off; + char *read_buf = NULL, *tmp_buf; + int *curr_offlen_ptr, *count, *send_size, *recv_size; + int *partial_send, *recd_from_proc, *start_pos; + /* Not convinced end_loc-st_loc couldn't be > int, so make these offsets*/ + ADIO_Offset real_size, size, for_curr_iter, for_next_iter; + int req_len, flag, rank; + MPI_Status status; + ADIOI_Flatlist_node *flat_buf=NULL; + MPI_Aint buftype_extent; + int coll_bufsize; +#ifdef RDCOLL_DEBUG + int iii; +#endif + *error_code = MPI_SUCCESS; /* changed below if error */ + /* only I/O errors are currently reported */ + +/* calculate the number of reads of size coll_bufsize + to be done by each process and the max among all processes. + That gives the no. of communication phases as well. + coll_bufsize is obtained from the hints object. */ + + coll_bufsize = fd->hints->cb_buffer_size; + + /* grab some initial values for st_loc and end_loc */ + for (i=0; i < nprocs; i++) { + if (others_req[i].count) { + st_loc = others_req[i].offsets[0]; + end_loc = others_req[i].offsets[0]; + break; + } + } + + /* now find the real values */ + for (i=0; i < nprocs; i++) + for (j=0; jcomm); + + if (ntimes) read_buf = (char *) ADIOI_Malloc(coll_bufsize); + + curr_offlen_ptr = (int *) ADIOI_Calloc(nprocs, sizeof(int)); + /* its use is explained below. calloc initializes to 0. */ + + count = (int *) ADIOI_Malloc(nprocs * sizeof(int)); + /* to store count of how many off-len pairs per proc are satisfied + in an iteration. */ + + partial_send = (int *) ADIOI_Calloc(nprocs, sizeof(int)); + /* if only a portion of the last off-len pair is sent to a process + in a particular iteration, the length sent is stored here. + calloc initializes to 0. */ + + send_size = (int *) ADIOI_Malloc(nprocs * sizeof(int)); + /* total size of data to be sent to each proc. in an iteration */ + + recv_size = (int *) ADIOI_Malloc(nprocs * sizeof(int)); + /* total size of data to be recd. from each proc. in an iteration. + Of size nprocs so that I can use MPI_Alltoall later. */ + + recd_from_proc = (int *) ADIOI_Calloc(nprocs, sizeof(int)); + /* amount of data recd. so far from each proc. Used in + ADIOI_Fill_user_buffer. initialized to 0 here. */ + + start_pos = (int *) ADIOI_Malloc(nprocs*sizeof(int)); + /* used to store the starting value of curr_offlen_ptr[i] in + this iteration */ + + ADIOI_Datatype_iscontig(datatype, &buftype_is_contig); + if (!buftype_is_contig) { + ADIOI_Flatten_datatype(datatype); + flat_buf = ADIOI_Flatlist; + while (flat_buf->type != datatype) flat_buf = flat_buf->next; + } + MPI_Type_extent(datatype, &buftype_extent); + + done = 0; + off = st_loc; + for_curr_iter = for_next_iter = 0; + + MPI_Comm_rank(fd->comm, &rank); + +#ifdef PROFILE + MPE_Log_event(14, 0, "end computation"); +#endif + + for (m=0; mcomm); + + nprocs_recv = 0; + for (i=0; i < nprocs; i++) if (recv_size[i]) nprocs_recv++; + + nprocs_send = 0; + for (i=0; icomm, requests+j); + j++; + buf_idx[i] += recv_size[i]; + } + } + else { +/* allocate memory for recv_buf and post receives */ + recv_buf = (char **) ADIOI_Malloc(nprocs * sizeof(char*)); + for (i=0; i < nprocs; i++) + if (recv_size[i]) recv_buf[i] = + (char *) ADIOI_Malloc(recv_size[i]); + + j = 0; + for (i=0; i < nprocs; i++) + if (recv_size[i]) { + MPI_Irecv(recv_buf[i], recv_size[i], MPI_BYTE, i, + myrank+i+100*iter, fd->comm, requests+j); + j++; +#ifdef RDCOLL_DEBUG + DBG_FPRINTF(stderr, "node %d, recv_size %d, tag %d \n", + myrank, recv_size[i], myrank+i+100*iter); +#endif + } + } + +/* create derived datatypes and send data */ + + j = 0; + for (i=0; icomm, requests+nprocs_recv+j); + MPI_Type_free(&send_type); + if (partial_send[i]) others_req[i].lens[k] = tmp; + j++; + } + } + + statuses = (MPI_Status *) ADIOI_Malloc((nprocs_send+nprocs_recv+1) * \ + sizeof(MPI_Status)); + /* +1 to avoid a 0-size malloc */ + + /* wait on the receives */ + if (nprocs_recv) { +#ifdef NEEDS_MPI_TEST + j = 0; + while (!j) MPI_Testall(nprocs_recv, requests, &j, statuses); +#else + MPI_Waitall(nprocs_recv, requests, statuses); +#endif + + /* if noncontiguous, to the copies from the recv buffers */ + if (!buftype_is_contig) + ADIOI_Fill_user_buffer(fd, buf, flat_buf, recv_buf, + offset_list, len_list, (unsigned*)recv_size, + requests, statuses, recd_from_proc, + nprocs, contig_access_count, + min_st_offset, fd_size, fd_start, fd_end, + buftype_extent); + } + + /* wait on the sends*/ + MPI_Waitall(nprocs_send, requests+nprocs_recv, statuses+nprocs_recv); + + ADIOI_Free(statuses); + ADIOI_Free(requests); + + if (!buftype_is_contig) { + for (i=0; i < nprocs; i++) + if (recv_size[i]) ADIOI_Free(recv_buf[i]); + ADIOI_Free(recv_buf); + } +#ifdef AGGREGATION_PROFILE + MPE_Log_event (5033, 0, NULL); +#endif +} + +#define ADIOI_BUF_INCR \ +{ \ + while (buf_incr) { \ + size_in_buf = ADIOI_MIN(buf_incr, flat_buf_sz); \ + user_buf_idx += size_in_buf; \ + flat_buf_sz -= size_in_buf; \ + if (!flat_buf_sz) { \ + if (flat_buf_idx < (flat_buf->count - 1)) flat_buf_idx++; \ + else { \ + flat_buf_idx = 0; \ + n_buftypes++; \ + } \ + user_buf_idx = flat_buf->indices[flat_buf_idx] + \ + (ADIO_Offset)n_buftypes*(ADIO_Offset)buftype_extent; \ + flat_buf_sz = flat_buf->blocklens[flat_buf_idx]; \ + } \ + buf_incr -= size_in_buf; \ + } \ +} + + +#define ADIOI_BUF_COPY \ +{ \ + while (size) { \ + size_in_buf = ADIOI_MIN(size, flat_buf_sz); \ + ADIOI_Assert((((ADIO_Offset)(MPIR_Upint)buf) + user_buf_idx) == (ADIO_Offset)(MPIR_Upint)(buf + user_buf_idx)); \ + ADIOI_Assert(size_in_buf == (size_t)size_in_buf); \ + memcpy(((char *) buf) + user_buf_idx, \ + &(recv_buf[p][recv_buf_idx[p]]), size_in_buf); \ + recv_buf_idx[p] += size_in_buf; /* already tested (size_t)size_in_buf*/ \ + user_buf_idx += size_in_buf; \ + flat_buf_sz -= size_in_buf; \ + if (!flat_buf_sz) { \ + if (flat_buf_idx < (flat_buf->count - 1)) flat_buf_idx++; \ + else { \ + flat_buf_idx = 0; \ + n_buftypes++; \ + } \ + user_buf_idx = flat_buf->indices[flat_buf_idx] + \ + (ADIO_Offset)n_buftypes*(ADIO_Offset)buftype_extent; \ + flat_buf_sz = flat_buf->blocklens[flat_buf_idx]; \ + } \ + size -= size_in_buf; \ + buf_incr -= size_in_buf; \ + } \ + ADIOI_BUF_INCR \ +} + +static void ADIOI_Fill_user_buffer(ADIO_File fd, void *buf, ADIOI_Flatlist_node + *flat_buf, char **recv_buf, ADIO_Offset + *offset_list, ADIO_Offset *len_list, + unsigned *recv_size, + MPI_Request *requests, MPI_Status *statuses, + int *recd_from_proc, int nprocs, + int contig_access_count, + ADIO_Offset min_st_offset, + ADIO_Offset fd_size, ADIO_Offset *fd_start, + ADIO_Offset *fd_end, + MPI_Aint buftype_extent) +{ + +/* this function is only called if buftype is not contig */ + + int i, p, flat_buf_idx; + ADIO_Offset flat_buf_sz, size_in_buf, buf_incr, size; + int n_buftypes; + ADIO_Offset off, len, rem_len, user_buf_idx; + /* Not sure unsigned is necessary, but it makes the math safer */ + unsigned *curr_from_proc, *done_from_proc, *recv_buf_idx; + + ADIOI_UNREFERENCED_ARG(requests); + ADIOI_UNREFERENCED_ARG(statuses); + +/* curr_from_proc[p] = amount of data recd from proc. p that has already + been accounted for so far + done_from_proc[p] = amount of data already recd from proc. p and + filled into user buffer in previous iterations + user_buf_idx = current location in user buffer + recv_buf_idx[p] = current location in recv_buf of proc. p */ + curr_from_proc = (unsigned *) ADIOI_Malloc(nprocs * sizeof(unsigned)); + done_from_proc = (unsigned *) ADIOI_Malloc(nprocs * sizeof(unsigned)); + recv_buf_idx = (unsigned *) ADIOI_Malloc(nprocs * sizeof(unsigned)); + + for (i=0; i < nprocs; i++) { + recv_buf_idx[i] = curr_from_proc[i] = 0; + done_from_proc[i] = recd_from_proc[i]; + } + + user_buf_idx = flat_buf->indices[0]; + flat_buf_idx = 0; + n_buftypes = 0; + flat_buf_sz = flat_buf->blocklens[0]; + + /* flat_buf_idx = current index into flattened buftype + flat_buf_sz = size of current contiguous component in + flattened buf */ + + for (i=0; i 0) { + len = rem_len; + /* NOTE: len value is modified by ADIOI_Calc_aggregator() to be no + * longer than the single region that processor "p" is responsible + * for. + */ + p = ADIOI_BG_Calc_aggregator(fd, + off, + min_st_offset, + &len, + fd_size, + fd_start, + fd_end); + + if (recv_buf_idx[p] < recv_size[p]) { + if (curr_from_proc[p]+len > done_from_proc[p]) { + if (done_from_proc[p] > curr_from_proc[p]) { + size = ADIOI_MIN(curr_from_proc[p] + len - + done_from_proc[p], recv_size[p]-recv_buf_idx[p]); + buf_incr = done_from_proc[p] - curr_from_proc[p]; + ADIOI_BUF_INCR + buf_incr = curr_from_proc[p]+len-done_from_proc[p]; + ADIOI_Assert((done_from_proc[p] + size) == (unsigned)((ADIO_Offset)done_from_proc[p] + size)); + curr_from_proc[p] = done_from_proc[p] + size; + ADIOI_BUF_COPY + } + else { + size = ADIOI_MIN(len,recv_size[p]-recv_buf_idx[p]); + buf_incr = len; + ADIOI_Assert((curr_from_proc[p] + size) == (unsigned)((ADIO_Offset)curr_from_proc[p] + size)); + curr_from_proc[p] += (unsigned) size; + ADIOI_BUF_COPY + } + } + else { + ADIOI_Assert((curr_from_proc[p] + len) == (unsigned)((ADIO_Offset)curr_from_proc[p] + len)); + curr_from_proc[p] += (unsigned) len; + buf_incr = len; + ADIOI_BUF_INCR + } + } + else { + buf_incr = len; + ADIOI_BUF_INCR + } + off += len; + rem_len -= len; + } + } + for (i=0; i < nprocs; i++) + if (recv_size[i]) recd_from_proc[i] = curr_from_proc[i]; + + ADIOI_Free(curr_from_proc); + ADIOI_Free(done_from_proc); + ADIOI_Free(recv_buf_idx); +} + +static void ADIOI_R_Exchange_data_alltoallv( + ADIO_File fd, void *buf, ADIOI_Flatlist_node + *flat_buf, ADIO_Offset *offset_list, ADIO_Offset + *len_list, int *send_size, int *recv_size, + int *count, int *start_pos, int *partial_send, + int *recd_from_proc, int nprocs, + int myrank, int + buftype_is_contig, int contig_access_count, + ADIO_Offset min_st_offset, ADIO_Offset fd_size, + ADIO_Offset *fd_start, ADIO_Offset *fd_end, + ADIOI_Access *others_req, + int iter, MPI_Aint buftype_extent, int *buf_idx) +{ + int i, j, k=0, tmp=0, nprocs_recv, nprocs_send; + char **recv_buf = NULL; + MPI_Request *requests=NULL; + MPI_Status *statuses=NULL; + int rtail, stail; + char *sbuf_ptr, *from_ptr; + int len; + int *sdispls, *rdispls; + char *all_recv_buf, *all_send_buf; + + /* exchange send_size info so that each process knows how much to + receive from whom and how much memory to allocate. */ + MPI_Alltoall(send_size, 1, MPI_INT, recv_size, 1, MPI_INT, fd->comm); + + nprocs_recv = 0; + for (i=0; icomm ); + +#if 0 + DBG_FPRINTF(stderr, "\tall_recv_buf = " ); + for (i=131072; i<131073; i++) { DBG_FPRINTF(stderr, "%2d,", all_recv_buf [i] ); } + DBG_FPRINTF(stderr, "\n" ); +#endif + + /* unpack at the receiver side */ + if (nprocs_recv) { + if (!buftype_is_contig) + ADIOI_Fill_user_buffer(fd, buf, flat_buf, recv_buf, + offset_list, len_list, (unsigned*)recv_size, + requests, statuses, /* never used inside */ + recd_from_proc, + nprocs, contig_access_count, + min_st_offset, fd_size, fd_start, fd_end, + buftype_extent); + else { + rtail = 0; + for (i=0; i < nprocs; i++) + if (recv_size[i]) { + memcpy( (char *)buf + buf_idx[i], all_recv_buf + rtail, recv_size[i] ); + buf_idx[i] += recv_size[i]; + rtail += recv_size[i]; + } + } + } + + ADIOI_Free( all_send_buf ); + ADIOI_Free( all_recv_buf ); + ADIOI_Free( recv_buf ); + ADIOI_Free( sdispls ); + ADIOI_Free( rdispls ); + return; +} diff --git a/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_read.c b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_read.c new file mode 100644 index 0000000000..9c1c1fbd58 --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_read.c @@ -0,0 +1,558 @@ +/* ---------------------------------------------------------------- */ +/* (C)Copyright IBM Corp. 2007, 2008 */ +/* ---------------------------------------------------------------- */ +/** + * \file ad_bg_read.c + * \brief ??? + */ + +/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* + * Copyright (C) 1997 University of Chicago. + * See COPYRIGHT notice in top-level directory. + */ + +#include "ad_bg.h" +#include "adio_extern.h" + +#include "ad_bg_tuning.h" +#ifdef AGGREGATION_PROFILE +#include "mpe.h" +#endif + +void ADIOI_BG_ReadContig(ADIO_File fd, void *buf, int count, + MPI_Datatype datatype, int file_ptr_type, + ADIO_Offset offset, ADIO_Status *status, int *error_code) +{ + int err=-1, datatype_size; + ADIO_Offset len; + static char myname[] = "ADIOI_BG_READCONTIG"; +#ifdef AGGREGATION_PROFILE + MPE_Log_event (5034, 0, NULL); +#endif +#if BG_PROFILE + /* timing */ + double io_time, io_time2; + + if (bgmpio_timing) { + io_time = MPI_Wtime(); + bgmpio_prof_cr[ BGMPIO_CIO_DATA_SIZE ] += len; + } +#endif + + MPI_Type_size(datatype, &datatype_size); + len = (ADIO_Offset)datatype_size * (ADIO_Offset)count; + ADIOI_Assert(len == (unsigned int) len); /* read takes an unsigned int parm */ + +#if BG_PROFILE + + if (file_ptr_type == ADIO_EXPLICIT_OFFSET) { + if (bgmpio_timing2) io_time2 = MPI_Wtime(); + if (fd->fp_sys_posn != offset) + lseek(fd->fd_sys, offset, SEEK_SET); + if (bgmpio_timing2) bgmpio_prof_cr[ BGMPIO_CIO_T_SEEK ] += (MPI_Wtime() - io_time2); + if (fd->atomicity) + ADIOI_WRITE_LOCK(fd, offset, SEEK_SET, len); + else ADIOI_READ_LOCK(fd, offset, SEEK_SET, len); + if (bgmpio_timing2) io_time2 = MPI_Wtime(); + err = read(fd->fd_sys, buf, (unsigned int)len); + if (bgmpio_timing2) bgmpio_prof_cr[ BGMPIO_CIO_T_POSI_RW ] += (MPI_Wtime() - io_time2); + ADIOI_UNLOCK(fd, offset, SEEK_SET, len); + fd->fp_sys_posn = offset + err; + /* individual file pointer not updated */ + } + else { /* read from curr. location of ind. file pointer */ + offset = fd->fp_ind; + if (bgmpio_timing2) io_time2 = MPI_Wtime(); + if (fd->fp_sys_posn != fd->fp_ind) + lseek(fd->fd_sys, fd->fp_ind, SEEK_SET); + if (bgmpio_timing2) bgmpio_prof_cr[ BGMPIO_CIO_T_SEEK ] += (MPI_Wtime() - io_time2); + if (fd->atomicity) + ADIOI_WRITE_LOCK(fd, offset, SEEK_SET, len); + else ADIOI_READ_LOCK(fd, offset, SEEK_SET, len); + if (bgmpio_timing2) io_time2 = MPI_Wtime(); + err = read(fd->fd_sys, buf, (unsigned int)len); + if (bgmpio_timing2) bgmpio_prof_cr[ BGMPIO_CIO_T_POSI_RW ] += (MPI_Wtime() - io_time2); + ADIOI_UNLOCK(fd, offset, SEEK_SET, len); + fd->fp_ind += err; + fd->fp_sys_posn = fd->fp_ind; + } + +#else /* BG_PROFILE */ + + if (file_ptr_type == ADIO_EXPLICIT_OFFSET) { + if (fd->fp_sys_posn != offset) + lseek(fd->fd_sys, offset, SEEK_SET); + if (fd->atomicity) + ADIOI_WRITE_LOCK(fd, offset, SEEK_SET, len); + else ADIOI_READ_LOCK(fd, offset, SEEK_SET, len); + err = read(fd->fd_sys, buf, (unsigned int)len); + ADIOI_UNLOCK(fd, offset, SEEK_SET, len); + fd->fp_sys_posn = offset + err; + /* individual file pointer not updated */ + } + else { /* read from curr. location of ind. file pointer */ + offset = fd->fp_ind; + if (fd->fp_sys_posn != fd->fp_ind) + lseek(fd->fd_sys, fd->fp_ind, SEEK_SET); + if (fd->atomicity) + ADIOI_WRITE_LOCK(fd, offset, SEEK_SET, len); + else ADIOI_READ_LOCK(fd, offset, SEEK_SET, len); + err = read(fd->fd_sys, buf, (unsigned int)len); + ADIOI_UNLOCK(fd, offset, SEEK_SET, len); + fd->fp_ind += err; + fd->fp_sys_posn = fd->fp_ind; + } + +#endif /* BG_PROFILE */ + +#if BG_PROFILE + if (bgmpio_timing) bgmpio_prof_cr[ BGMPIO_CIO_T_MPIO_RW ] += (MPI_Wtime() - io_time); +#endif + + /* --BEGIN ERROR HANDLING-- */ + if (err == -1) { + *error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, + myname, __LINE__, MPI_ERR_IO, + "**io", "**io %s", strerror(errno)); + return; + } + /* --END ERROR HANDLING-- */ + +#ifdef HAVE_STATUS_SET_BYTES + MPIR_Status_set_bytes(status, datatype, err); +#endif + + *error_code = MPI_SUCCESS; +#ifdef AGGREGATION_PROFILE + MPE_Log_event (5035, 0, NULL); +#endif +} + + +#define ADIOI_BUFFERED_READ \ +{ \ + if (req_off >= readbuf_off + readbuf_len) { \ + readbuf_off = req_off; \ + readbuf_len = (unsigned) (ADIOI_MIN(max_bufsize, end_offset-readbuf_off+1));\ + lseek(fd->fd_sys, readbuf_off, SEEK_SET);\ + if (!(fd->atomicity)) ADIOI_READ_LOCK(fd, readbuf_off, SEEK_SET, readbuf_len);\ + err = read(fd->fd_sys, readbuf, readbuf_len);\ + if (!(fd->atomicity)) ADIOI_UNLOCK(fd, readbuf_off, SEEK_SET, readbuf_len);\ + if (err == -1) err_flag = 1; \ + } \ + while (req_len > readbuf_off + readbuf_len - req_off) { \ + ADIOI_Assert((readbuf_off + readbuf_len - req_off) == (int) (readbuf_off + readbuf_len - req_off));\ + partial_read = (int) (readbuf_off + readbuf_len - req_off); \ + tmp_buf = (char *) ADIOI_Malloc(partial_read); \ + memcpy(tmp_buf, readbuf+readbuf_len-partial_read, partial_read); \ + ADIOI_Free(readbuf); \ + readbuf = (char *) ADIOI_Malloc(partial_read + max_bufsize); \ + memcpy(readbuf, tmp_buf, partial_read); \ + ADIOI_Free(tmp_buf); \ + readbuf_off += readbuf_len-partial_read; \ + readbuf_len = (unsigned) (partial_read + ADIOI_MIN(max_bufsize, \ + end_offset-readbuf_off+1)); \ + lseek(fd->fd_sys, readbuf_off+partial_read, SEEK_SET);\ + if (!(fd->atomicity)) ADIOI_READ_LOCK(fd, readbuf_off+partial_read, SEEK_SET, readbuf_len-partial_read);\ + err = read(fd->fd_sys, readbuf+partial_read, readbuf_len-partial_read);\ + if (!(fd->atomicity)) ADIOI_UNLOCK(fd, readbuf_off+partial_read, SEEK_SET, readbuf_len-partial_read);\ + if (err == -1) err_flag = 1; \ + } \ + ADIOI_Assert(req_len == (size_t)req_len); \ + memcpy((char *)buf + userbuf_off, readbuf+req_off-readbuf_off, req_len); \ +} + + +void ADIOI_BG_ReadStrided(ADIO_File fd, void *buf, int count, + MPI_Datatype datatype, int file_ptr_type, + ADIO_Offset offset, ADIO_Status *status, int + *error_code) +{ +/* offset is in units of etype relative to the filetype. */ + + + ADIOI_Flatlist_node *flat_buf, *flat_file; + ADIO_Offset i_offset, new_brd_size, brd_size, size; + int i, j, k, err=-1, st_index=0; + ADIO_Offset frd_size=0, new_frd_size, st_frd_size; + unsigned num, bufsize; + int n_etypes_in_filetype; + ADIO_Offset n_filetypes, etype_in_filetype, st_n_filetypes, size_in_filetype; + ADIO_Offset abs_off_in_filetype=0; + int filetype_size, etype_size, buftype_size, partial_read; + MPI_Aint filetype_extent, buftype_extent; + int buf_count, buftype_is_contig, filetype_is_contig; + ADIO_Offset userbuf_off, req_len, sum; + ADIO_Offset off, req_off, disp, end_offset=0, readbuf_off, start_off; + char *readbuf, *tmp_buf, *value; + int err_flag=0, info_flag; + unsigned max_bufsize, readbuf_len; + static char myname[] = "ADIOI_BG_READSTRIDED"; + + if (fd->hints->ds_read == ADIOI_HINT_DISABLE) { + /* if user has disabled data sieving on reads, use naive + * approach instead. + */ + /*FPRINTF(stderr, "ADIOI_GEN_ReadStrided_naive(%d):\n", __LINE__);*/ + ADIOI_GEN_ReadStrided_naive(fd, + buf, + count, + datatype, + file_ptr_type, + offset, + status, + error_code); + return; + } + /*FPRINTF(stderr, "%s(%d):\n",myname, __LINE__);*/ + + ADIOI_Datatype_iscontig(datatype, &buftype_is_contig); + ADIOI_Datatype_iscontig(fd->filetype, &filetype_is_contig); + + MPI_Type_size(fd->filetype, &filetype_size); + if ( ! filetype_size ) { +#ifdef HAVE_STATUS_SET_BYTES + MPIR_Status_set_bytes(status, datatype, 0); +#endif + *error_code = MPI_SUCCESS; + return; + } + + MPI_Type_extent(fd->filetype, &filetype_extent); + MPI_Type_size(datatype, &buftype_size); + MPI_Type_extent(datatype, &buftype_extent); + etype_size = fd->etype_size; + + ADIOI_Assert((buftype_size * count) == ((ADIO_Offset)(unsigned)buftype_size * (ADIO_Offset)count)); + bufsize = buftype_size * count; + +/* get max_bufsize from the info object. */ + + value = (char *) ADIOI_Malloc((MPI_MAX_INFO_VAL+1)*sizeof(char)); + ADIOI_Info_get(fd->info, "ind_rd_buffer_size", MPI_MAX_INFO_VAL, value, + &info_flag); + max_bufsize = atoi(value); + ADIOI_Free(value); + + if (!buftype_is_contig && filetype_is_contig) { + +/* noncontiguous in memory, contiguous in file. */ + + ADIOI_Flatten_datatype(datatype); + flat_buf = ADIOI_Flatlist; + while (flat_buf->type != datatype) flat_buf = flat_buf->next; + + off = (file_ptr_type == ADIO_INDIVIDUAL) ? fd->fp_ind : + fd->disp + (ADIO_Offset)etype_size * offset; + + start_off = off; + end_offset = off + bufsize - 1; + readbuf_off = off; + readbuf = (char *) ADIOI_Malloc(max_bufsize); + readbuf_len = (unsigned) (ADIOI_MIN(max_bufsize, end_offset-readbuf_off+1)); + +/* if atomicity is true, lock (exclusive) the region to be accessed */ + if (fd->atomicity) + ADIOI_WRITE_LOCK(fd, start_off, SEEK_SET, end_offset-start_off+1); + + lseek(fd->fd_sys, readbuf_off, SEEK_SET); + if (!(fd->atomicity)) ADIOI_READ_LOCK(fd, readbuf_off, SEEK_SET, readbuf_len); + err = read(fd->fd_sys, readbuf, readbuf_len); + if (!(fd->atomicity)) ADIOI_UNLOCK(fd, readbuf_off, SEEK_SET, readbuf_len); + if (err == -1) err_flag = 1; + + for (j=0; jcount; i++) { + userbuf_off = (ADIO_Offset)j*(ADIO_Offset)buftype_extent + flat_buf->indices[i]; + req_off = off; + req_len = flat_buf->blocklens[i]; + ADIOI_BUFFERED_READ + off += flat_buf->blocklens[i]; + } + } + + if (fd->atomicity) + ADIOI_UNLOCK(fd, start_off, SEEK_SET, end_offset-start_off+1); + + if (file_ptr_type == ADIO_INDIVIDUAL) fd->fp_ind = off; + + ADIOI_Free(readbuf); /* malloced in the buffered_read macro */ + + if (err_flag) { + *error_code = MPIO_Err_create_code(MPI_SUCCESS, + MPIR_ERR_RECOVERABLE, myname, + __LINE__, MPI_ERR_IO, "**io", + "**io %s", strerror(errno)); + } + else *error_code = MPI_SUCCESS; + } + + else { /* noncontiguous in file */ + +/* filetype already flattened in ADIO_Open */ + flat_file = ADIOI_Flatlist; + while (flat_file->type != fd->filetype) flat_file = flat_file->next; + disp = fd->disp; + + if (file_ptr_type == ADIO_INDIVIDUAL) { + /* Wei-keng reworked type processing to be a bit more efficient */ + offset = fd->fp_ind - disp; + n_filetypes = (offset - flat_file->indices[0]) / filetype_extent; + offset -= (ADIO_Offset)n_filetypes * filetype_extent; + /* now offset is local to this extent */ + + /* find the block where offset is located, skip blocklens[i]==0 */ + for (i=0; icount; i++) { + ADIO_Offset dist; + if (flat_file->blocklens[i] == 0) continue; + dist = flat_file->indices[i] + flat_file->blocklens[i] - offset; + /* frd_size is from offset to the end of block i */ + if (dist == 0) { + i++; + offset = flat_file->indices[i]; + frd_size = flat_file->blocklens[i]; + break; + } + if (dist > 0) { + frd_size = dist; + break; + } + } + st_index = i; /* starting index in flat_file->indices[] */ + offset += disp + (ADIO_Offset)n_filetypes*filetype_extent; + } + else { + n_etypes_in_filetype = filetype_size/etype_size; + n_filetypes = offset / n_etypes_in_filetype; + etype_in_filetype = offset % n_etypes_in_filetype; + size_in_filetype = etype_in_filetype * etype_size; + + sum = 0; + for (i=0; icount; i++) { + sum += flat_file->blocklens[i]; + if (sum > size_in_filetype) { + st_index = i; + frd_size = sum - size_in_filetype; + abs_off_in_filetype = flat_file->indices[i] + + size_in_filetype - (sum - flat_file->blocklens[i]); + break; + } + } + + /* abs. offset in bytes in the file */ + offset = disp + (ADIO_Offset) n_filetypes*filetype_extent + + abs_off_in_filetype; + } + + start_off = offset; + + /* Wei-keng Liao: read request is within a single flat_file contig + * block e.g. with subarray types that actually describe the whole + * array */ + if (buftype_is_contig && bufsize <= frd_size) { + ADIO_ReadContig(fd, buf, bufsize, MPI_BYTE, ADIO_EXPLICIT_OFFSET, + offset, status, error_code); + + if (file_ptr_type == ADIO_INDIVIDUAL) { + /* update MPI-IO file pointer to point to the first byte that + * can be accessed in the fileview. */ + fd->fp_ind = offset + bufsize; + if (bufsize == frd_size) { + do { + st_index++; + if (st_index == flat_file->count) { + st_index = 0; + n_filetypes++; + } + } while (flat_file->blocklens[st_index] == 0); + fd->fp_ind = disp + flat_file->indices[st_index] + + n_filetypes*filetype_extent; + } + } + fd->fp_sys_posn = -1; /* set it to null. */ +#ifdef HAVE_STATUS_SET_BYTES + MPIR_Status_set_bytes(status, datatype, bufsize); +#endif + return; + } + + /* Calculate end_offset, the last byte-offset that will be accessed. + e.g., if start_offset=0 and 100 bytes to be read, end_offset=99*/ + + st_frd_size = frd_size; + st_n_filetypes = n_filetypes; + i_offset = 0; + j = st_index; + off = offset; + frd_size = ADIOI_MIN(st_frd_size, bufsize); + while (i_offset < bufsize) { + i_offset += frd_size; + end_offset = off + frd_size - 1; + + j = (j+1) % flat_file->count; + n_filetypes += (j == 0) ? 1 : 0; + while (flat_file->blocklens[j]==0) { + j = (j+1) % flat_file->count; + n_filetypes += (j == 0) ? 1 : 0; + } + off = disp + flat_file->indices[j] + n_filetypes*(ADIO_Offset)filetype_extent; + frd_size = ADIOI_MIN(flat_file->blocklens[j], bufsize-i_offset); + } + +/* if atomicity is true, lock (exclusive) the region to be accessed */ + if (fd->atomicity) + ADIOI_WRITE_LOCK(fd, start_off, SEEK_SET, end_offset-start_off+1); + + /* initial read into readbuf */ + readbuf_off = offset; + readbuf = (char *) ADIOI_Malloc(max_bufsize); + readbuf_len = (unsigned) (ADIOI_MIN(max_bufsize, end_offset-readbuf_off+1)); + + lseek(fd->fd_sys, offset, SEEK_SET); + if (!(fd->atomicity)) ADIOI_READ_LOCK(fd, offset, SEEK_SET, readbuf_len); + err = read(fd->fd_sys, readbuf, readbuf_len); + if (!(fd->atomicity)) ADIOI_UNLOCK(fd, offset, SEEK_SET, readbuf_len); + + if (err == -1) err_flag = 1; + + if (buftype_is_contig && !filetype_is_contig) { + +/* contiguous in memory, noncontiguous in file. should be the most + common case. */ + + i_offset = 0; + j = st_index; + off = offset; + n_filetypes = st_n_filetypes; + frd_size = ADIOI_MIN(st_frd_size, bufsize); + while (i_offset < bufsize) { + if (frd_size) { + /* TYPE_UB and TYPE_LB can result in + frd_size = 0. save system call in such cases */ + /* lseek(fd->fd_sys, off, SEEK_SET); + err = read(fd->fd_sys, ((char *) buf) + i, frd_size);*/ + + req_off = off; + req_len = frd_size; + userbuf_off = i_offset; + ADIOI_BUFFERED_READ + } + i_offset += frd_size; + + if (off + frd_size < disp + flat_file->indices[j] + + flat_file->blocklens[j] + n_filetypes*(ADIO_Offset)filetype_extent) + off += frd_size; + /* did not reach end of contiguous block in filetype. + no more I/O needed. off is incremented by frd_size. */ + else { + j = (j+1) % flat_file->count; + n_filetypes += (j == 0) ? 1 : 0; + while (flat_file->blocklens[j]==0) { + j = (j+1) % flat_file->count; + n_filetypes += (j == 0) ? 1 : 0; + } + off = disp + flat_file->indices[j] + + n_filetypes*(ADIO_Offset)filetype_extent; + frd_size = ADIOI_MIN(flat_file->blocklens[j], bufsize-i_offset); + } + } + } + else { +/* noncontiguous in memory as well as in file */ + + ADIOI_Flatten_datatype(datatype); + flat_buf = ADIOI_Flatlist; + while (flat_buf->type != datatype) flat_buf = flat_buf->next; + + k = num = buf_count = 0; + i_offset = flat_buf->indices[0]; + j = st_index; + off = offset; + n_filetypes = st_n_filetypes; + frd_size = st_frd_size; + brd_size = flat_buf->blocklens[0]; + + while (num < bufsize) { + size = ADIOI_MIN(frd_size, brd_size); + if (size) { + /* lseek(fd->fd_sys, off, SEEK_SET); + err = read(fd->fd_sys, ((char *) buf) + i, size); */ + + req_off = off; + req_len = size; + userbuf_off = i_offset; + ADIOI_BUFFERED_READ + } + + new_frd_size = frd_size; + new_brd_size = brd_size; + + if (size == frd_size) { +/* reached end of contiguous block in file */ + j = (j+1) % flat_file->count; + n_filetypes += (j == 0) ? 1 : 0; + while (flat_file->blocklens[j]==0) { + j = (j+1) % flat_file->count; + n_filetypes += (j == 0) ? 1 : 0; + } + + off = disp + flat_file->indices[j] + + n_filetypes*(ADIO_Offset)filetype_extent; + + new_frd_size = flat_file->blocklens[j]; + if (size != brd_size) { + i_offset += size; + new_brd_size -= size; + } + } + + if (size == brd_size) { +/* reached end of contiguous block in memory */ + + k = (k + 1)%flat_buf->count; + buf_count++; + i_offset = ((ADIO_Offset)buftype_extent*(ADIO_Offset)(buf_count/flat_buf->count) + + flat_buf->indices[k]); + new_brd_size = flat_buf->blocklens[k]; + if (size != frd_size) { + off += size; + new_frd_size -= size; + } + } + ADIOI_Assert(((ADIO_Offset)num + size) == (unsigned)(num + size)); + num += size; + frd_size = new_frd_size; + brd_size = new_brd_size; + } + } + + if (fd->atomicity) + ADIOI_UNLOCK(fd, start_off, SEEK_SET, end_offset-start_off+1); + + if (file_ptr_type == ADIO_INDIVIDUAL) fd->fp_ind = off; + + ADIOI_Free(readbuf); /* malloced in the buffered_read macro */ + + if (err_flag) { + *error_code = MPIO_Err_create_code(MPI_SUCCESS, + MPIR_ERR_RECOVERABLE, myname, + __LINE__, MPI_ERR_IO, "**io", + "**io %s", strerror(errno)); + } + else *error_code = MPI_SUCCESS; + } + + fd->fp_sys_posn = -1; /* set it to null. */ + +#ifdef HAVE_STATUS_SET_BYTES + MPIR_Status_set_bytes(status, datatype, bufsize); +/* This is a temporary way of filling in status. The right way is to + keep track of how much data was actually read and placed in buf + by ADIOI_BUFFERED_READ. */ +#endif + + if (!buftype_is_contig) ADIOI_Delete_flattened(datatype); +} diff --git a/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_setsh.c b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_setsh.c new file mode 100644 index 0000000000..ef52af9a3e --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_setsh.c @@ -0,0 +1,68 @@ +/* ---------------------------------------------------------------- */ +/* (C)Copyright IBM Corp. 2007, 2008 */ +/* ---------------------------------------------------------------- */ +/** + * \file ad_bg_setsh.c + * \brief ??? + */ + +/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* + * Copyright (C) 1997 University of Chicago. + * See COPYRIGHT notice in top-level directory. + */ + +#include "ad_bg.h" + +/* set the shared file pointer to "offset" etypes relative to the current + view */ + +/* +This looks very similar to ADIOI_GEN_Set_shared_fp, except this +function avoids locking the file twice. The generic version does + +Write lock +ADIO_WriteContig +Unlock + +For BG, ADIOI_BG_WriteContig does a lock before writing to disable +caching. To avoid the lock being called twice, this version for BG does + +Write lock +Lseek +Write +Unlock + +*/ + +void ADIOI_BG_Set_shared_fp(ADIO_File fd, ADIO_Offset offset, int *error_code) +{ + int err; + MPI_Comm dupcommself; + static char myname[] = "ADIOI_BG_SET_SHARED_FP"; + + if (fd->shared_fp_fd == ADIO_FILE_NULL) { + MPI_Comm_dup(MPI_COMM_SELF, &dupcommself); + fd->shared_fp_fd = ADIO_Open(MPI_COMM_SELF, dupcommself, + fd->shared_fp_fname, + fd->file_system, fd->fns, + ADIO_CREATE | ADIO_RDWR | ADIO_DELETE_ON_CLOSE, + 0, MPI_BYTE, MPI_BYTE, MPI_INFO_NULL, + ADIO_PERM_NULL, error_code); + } + + if (*error_code != MPI_SUCCESS) return; + + ADIOI_WRITE_LOCK(fd->shared_fp_fd, 0, SEEK_SET, sizeof(ADIO_Offset)); + lseek(fd->shared_fp_fd->fd_sys, 0, SEEK_SET); + err = write(fd->shared_fp_fd->fd_sys, &offset, sizeof(ADIO_Offset)); + ADIOI_UNLOCK(fd->shared_fp_fd, 0, SEEK_SET, sizeof(ADIO_Offset)); + + if (err == -1) { + *error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, + myname, __LINE__, MPI_ERR_IO, + "**io", + "**io %s", strerror(errno)); + } + else *error_code = MPI_SUCCESS; +} diff --git a/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_tuning.c b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_tuning.c new file mode 100644 index 0000000000..480ac186a2 --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_tuning.c @@ -0,0 +1,164 @@ +/* ---------------------------------------------------------------- */ +/* (C)Copyright IBM Corp. 2007, 2008 */ +/* ---------------------------------------------------------------- */ +/** + * \file ad_bg_tuning.c + * \brief Defines ad_bg performance tuning + */ + +/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* + * Copyright (C) 2008 University of Chicago. + * See COPYRIGHT notice in top-level directory. + */ + +/*--------------------------------------------------------------------- + * ad_bg_tuning.c + * + * defines global variables and functions for performance tuning and + * functional debugging. + *---------------------------------------------------------------------*/ + +#include "ad_bg_tuning.h" +#include "mpi.h" + +#if !defined(PVFS2_SUPER_MAGIC) + #define PVFS2_SUPER_MAGIC (0x20030528) +#endif + + +int bgmpio_timing; +int bgmpio_timing2; +int bgmpio_comm; +int bgmpio_tunegather; +int bgmpio_tuneblocking; +long bglocklessmpio_f_type; + +double bgmpio_prof_cw [BGMPIO_CIO_LAST]; +double bgmpio_prof_cr [BGMPIO_CIO_LAST]; + +/* set internal variables for tuning environment variables */ +/** \page mpiio_vars MPIIO Configuration + \section env_sec Environment Variables + * - BGMPIO_COMM - Define how data is exchanged on collective + * reads and writes. Possible values: + * - 0 - Use MPI_Alltoallv. + * - 1 - Use MPI_Isend/MPI_Irecv. + * - Default is 0. + * + * - BGMPIO_TIMING - collect timing breakdown for MPI I/O collective calls. + * Must also compile the library with BG_PROFILE defined. Possible values: + * - 0 - Do not collect/report timing. + * - 1 - Collect/report timing. + * - Default is 0. + * + * - BGMPIO_TIMING2 - collect additional averages for MPI I/O collective calls. + * Must also compile the library with BG_PROFILE defined. Possible values: + * - 0 - Do not collect/report averages. + * - 1 - Collect/report averages. + * - Default is 0. + * + * - BGMPIO_TUNEGATHER - Tune how starting and ending offsets are communicated + * for aggregator collective i/o. Possible values: + * - 0 - Use two MPI_Allgather's to collect starting and ending offsets. + * - 1 - Use MPI_Allreduce(MPI_MAX) to collect starting and ending offsets. + * - Default is 1. + * + * - BGMPIO_TUNEBLOCKING - Tune how aggregate file domains are + * calculated (block size). Possible values: + * - 0 - Evenly calculate file domains across aggregators. Also use + * MPI_Isend/MPI_Irecv to exchange domain information. + * - 1 - Align file domains with the underlying file system's block size. Also use + * MPI_Alltoallv to exchange domain information. + * - Default is 1. + * + * - BGLOCKLESSMPIO_F_TYPE - Specify a filesystem type that should run + * the ad_bglockless driver. NOTE: Using romio prefixes (such as + * "bg:" or "bglockless:") on a file name will override this environment + * variable. Possible values: + * - 0xnnnnnnnn - Any valid file system type (or "magic number") from + * statfs() field f_type. + * - The default is 0x20030528 (PVFS2_SUPER_MAGIC) + * +*/ +void ad_bg_get_env_vars() { + char *x, *dummy; + + bgmpio_comm = 0; + x = getenv( "BGMPIO_COMM" ); + if (x) bgmpio_comm = atoi(x); + bgmpio_timing = 0; + x = getenv( "BGMPIO_TIMING" ); + if (x) bgmpio_timing = atoi(x); + bgmpio_timing2 = 0; + x = getenv( "BGMPIO_TIMING2" ); + if (x) bgmpio_timing2 = atoi(x); + bgmpio_tunegather = 1; + x = getenv( "BGMPIO_TUNEGATHER" ); + if (x) bgmpio_tunegather = atoi(x); + bgmpio_tuneblocking = 1; + x = getenv( "BGMPIO_TUNEBLOCKING" ); + if (x) bgmpio_tuneblocking = atoi(x); + bglocklessmpio_f_type = PVFS2_SUPER_MAGIC; + x = getenv( "BGLOCKLESSMPIO_F_TYPE" ); + if (x) bglocklessmpio_f_type = strtol(x,&dummy,0); + DBG_FPRINTF(stderr,"BGLOCKLESSMPIO_F_TYPE=%ld/%#lX\n", + bglocklessmpio_f_type,bglocklessmpio_f_type); +} + +/* report timing breakdown for MPI I/O collective call */ +void ad_bg_wr_timing_report( int rw, ADIO_File fd, int myrank, int nprocs ) +{ + int i; + + if (bgmpio_timing) { + + double *bgmpio_prof_org = bgmpio_prof_cr; + if (rw) bgmpio_prof_org = bgmpio_prof_cw; + + double bgmpio_prof_avg[ BGMPIO_CIO_LAST ]; + double bgmpio_prof_max[ BGMPIO_CIO_LAST ]; + + MPI_Reduce( bgmpio_prof_org, bgmpio_prof_avg, BGMPIO_CIO_LAST, MPI_DOUBLE, MPI_SUM, 0, fd->comm ); + MPI_Reduce( bgmpio_prof_org, bgmpio_prof_max, BGMPIO_CIO_LAST, MPI_DOUBLE, MPI_MAX, 0, fd->comm ); + + if (myrank == 0) { + + for (i=0; i= LEVEL) { \ + int i; \ + for ( i = 0; i < BGMPIO_T_LAST; i ++ ) \ + bgmpio_prof_c##RW [ i ] = 0; \ + } + +#define BGMPIO_T_CIO_REPORT( LEVEL, RW, FD, MYRANK, NPROCS ) \ + if (bgmpio_timing_cw_level >= LEVEL) { \ + ad_bg_timing_crw_report ( RW, FD, MYRANK, NPROCS ); \ + } + +#define BGMPIO_T_CIO_SET_GET( LEVEL, RW, DOBAR, ISSET, ISGET, VAR1, VAR2 ) \ + if (bgmpio_timing_cw_level >= LEVEL) { \ + if ( DOBAR ) MPI_Barrier( fd->comm ); \ + double temp = MPI_Wtime(); \ + if ( ISSET ) bgmpio_prof_c##RW [ VAR1 ] = temp; \ + if ( ISGET ) bgmpio_prof_c##RW [ VAR2 ] = temp - bgmpio_prof_c##RW [ VAR2 ] ; \ + } + +#endif /* AD_BG_TUNING_H_ */ diff --git a/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_wrcoll.c b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_wrcoll.c new file mode 100644 index 0000000000..f1dbd67260 --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_wrcoll.c @@ -0,0 +1,1532 @@ +/* ---------------------------------------------------------------- */ +/* (C)Copyright IBM Corp. 2007, 2008 */ +/* ---------------------------------------------------------------- */ +/** + * \file ad_bg_wrcoll.c + * \brief ??? + */ + +/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* + * Copyright (C) 1997 University of Chicago. + * See COPYRIGHT notice in top-level directory. + */ + +#include "adio.h" +#include "adio_extern.h" +#include "ad_bg.h" +#include "ad_bg_pset.h" +#include "ad_bg_aggrs.h" + +#include "mpitypedefs.h" + +#ifdef AGGREGATION_PROFILE +#include "mpe.h" +#endif +#ifdef PROFILE +#include "mpe.h" +#endif + +/* prototypes of functions used for collective writes only. */ +static void ADIOI_Exch_and_write(ADIO_File fd, const void *buf, MPI_Datatype + datatype, int nprocs, int myrank, ADIOI_Access + *others_req, ADIO_Offset *offset_list, + ADIO_Offset *len_list, int contig_access_count, ADIO_Offset + min_st_offset, ADIO_Offset fd_size, + ADIO_Offset *fd_start, ADIO_Offset *fd_end, + int *buf_idx, int *error_code); +static void ADIOI_W_Exchange_data(ADIO_File fd, const void *buf, char *write_buf, + ADIOI_Flatlist_node *flat_buf, ADIO_Offset + *offset_list, ADIO_Offset *len_list, int *send_size, + int *recv_size, ADIO_Offset off, int size, + int *count, int *start_pos, int *partial_recv, + int *sent_to_proc, int nprocs, + int myrank, int + buftype_is_contig, int contig_access_count, + ADIO_Offset min_st_offset, ADIO_Offset fd_size, + ADIO_Offset *fd_start, ADIO_Offset *fd_end, + ADIOI_Access *others_req, + int *send_buf_idx, int *curr_to_proc, + int *done_to_proc, int *hole, int iter, + MPI_Aint buftype_extent, int *buf_idx, int *error_code); +static void ADIOI_W_Exchange_data_alltoallv( + ADIO_File fd, const void *buf, + char *write_buf, /* 1 */ + ADIOI_Flatlist_node *flat_buf, + ADIO_Offset *offset_list, + ADIO_Offset *len_list, int *send_size, int *recv_size, + ADIO_Offset off, int size, /* 2 */ + int *count, int *start_pos, int *partial_recv, + int *sent_to_proc, int nprocs, int myrank, + int buftype_is_contig, int contig_access_count, + ADIO_Offset min_st_offset, + ADIO_Offset fd_size, + ADIO_Offset *fd_start, + ADIO_Offset *fd_end, + ADIOI_Access *others_req, + int *send_buf_idx, int *curr_to_proc, /* 3 */ + int *done_to_proc, int *hole, /* 4 */ + int iter, MPI_Aint buftype_extent, int *buf_idx, + int *error_code); +static void ADIOI_Fill_send_buffer(ADIO_File fd, const void *buf, ADIOI_Flatlist_node + *flat_buf, char **send_buf, ADIO_Offset + *offset_list, ADIO_Offset *len_list, int *send_size, + MPI_Request *requests, int *sent_to_proc, + int nprocs, int myrank, + int contig_access_count, ADIO_Offset + min_st_offset, ADIO_Offset fd_size, + ADIO_Offset *fd_start, ADIO_Offset *fd_end, + int *send_buf_idx, int *curr_to_proc, + int *done_to_proc, int iter, + MPI_Aint buftype_extent); +static void ADIOI_Fill_send_buffer_nosend(ADIO_File fd, const void *buf, ADIOI_Flatlist_node + *flat_buf, char **send_buf, ADIO_Offset + *offset_list, ADIO_Offset *len_list, int *send_size, + MPI_Request *requests, int *sent_to_proc, + int nprocs, int myrank, + int contig_access_count, ADIO_Offset + min_st_offset, ADIO_Offset fd_size, + ADIO_Offset *fd_start, ADIO_Offset *fd_end, + int *send_buf_idx, int *curr_to_proc, + int *done_to_proc, int iter, + MPI_Aint buftype_extent); +static void ADIOI_Heap_merge(ADIOI_Access *others_req, int *count, + ADIO_Offset *srt_off, int *srt_len, int *start_pos, + int nprocs, int nprocs_recv, int total_elements); + + +void ADIOI_BG_WriteStridedColl(ADIO_File fd, const void *buf, int count, + MPI_Datatype datatype, int file_ptr_type, + ADIO_Offset offset, ADIO_Status *status, int + *error_code) +{ +/* Uses a generalized version of the extended two-phase method described + in "An Extended Two-Phase Method for Accessing Sections of + Out-of-Core Arrays", Rajeev Thakur and Alok Choudhary, + Scientific Programming, (5)4:301--317, Winter 1996. + http://www.mcs.anl.gov/home/thakur/ext2ph.ps */ + + ADIOI_Access *my_req; + /* array of nprocs access structures, one for each other process in + whose file domain this process's request lies */ + + ADIOI_Access *others_req; + /* array of nprocs access structures, one for each other process + whose request lies in this process's file domain. */ + + int i, filetype_is_contig, nprocs, nprocs_for_coll, myrank; + int contig_access_count=0, interleave_count = 0, buftype_is_contig; + int *count_my_req_per_proc, count_my_req_procs, count_others_req_procs; + ADIO_Offset orig_fp, start_offset, end_offset, fd_size, min_st_offset, off; + ADIO_Offset *offset_list = NULL, *st_offsets = NULL, *fd_start = NULL, + *fd_end = NULL, *end_offsets = NULL; + ADIO_Offset *bg_offsets0 = NULL, *bg_offsets = NULL; + int ii; + + int *buf_idx = NULL; + ADIO_Offset *len_list = NULL; +#if BG_PROFILE + BGMPIO_T_CIO_RESET( 0, w ) +#endif +#if 0 + /* From common code - not implemented for bg.*/ + int old_error, tmp_error; +#endif +#ifdef PROFILE + MPE_Log_event(13, 0, "start computation"); +#endif + +#if 0 +/* From common code - not implemented for bg. */ + if (fd->hints->cb_pfr != ADIOI_HINT_DISABLE) { + ADIOI_IOStridedColl (fd, buf, count, ADIOI_WRITE, datatype, + file_ptr_type, offset, status, error_code); + return; + } +#endif + MPI_Comm_size(fd->comm, &nprocs); + MPI_Comm_rank(fd->comm, &myrank); + +/* the number of processes that actually perform I/O, nprocs_for_coll, + * is stored in the hints off the ADIO_File structure + */ + nprocs_for_coll = fd->hints->cb_nodes; + orig_fp = fd->fp_ind; + +#if BG_PROFILE + BGMPIO_T_CIO_SET_GET( 0, w, 0, 1, 0, BGMPIO_CIO_LCOMP, BGMPIO_CIO_LAST ) +#endif + + + /* only check for interleaving if cb_write isn't disabled */ + if (fd->hints->cb_write != ADIOI_HINT_DISABLE) { + /* For this process's request, calculate the list of offsets and + lengths in the file and determine the start and end offsets. */ + + /* Note: end_offset points to the last byte-offset that will be accessed. + e.g., if start_offset=0 and 100 bytes to be read, end_offset=99*/ + + ADIOI_Calc_my_off_len(fd, count, datatype, file_ptr_type, offset, + &offset_list, &len_list, &start_offset, + &end_offset, &contig_access_count); + +#if BG_PROFILE + BGMPIO_T_CIO_SET_GET( 0, w, 1, 1, 1, BGMPIO_CIO_GATHER, BGMPIO_CIO_LCOMP ) +#endif + + /* each process communicates its start and end offsets to other + processes. The result is an array each of start and end offsets stored + in order of process rank. */ + + st_offsets = (ADIO_Offset *) ADIOI_Malloc(nprocs*sizeof(ADIO_Offset)); + end_offsets = (ADIO_Offset *) ADIOI_Malloc(nprocs*sizeof(ADIO_Offset)); + + if (bgmpio_tunegather) { + bg_offsets0 = (ADIO_Offset *) ADIOI_Malloc(2*nprocs*sizeof(ADIO_Offset)); + bg_offsets = (ADIO_Offset *) ADIOI_Malloc(2*nprocs*sizeof(ADIO_Offset)); + for (ii=0; iicomm ); + + for (ii=0; iicomm); + MPI_Allgather(&end_offset, 1, ADIO_OFFSET, end_offsets, 1, + ADIO_OFFSET, fd->comm); + } + +#if BG_PROFILE + BGMPIO_T_CIO_SET_GET( 0, w, 0, 1, 1, BGMPIO_CIO_PATANA, BGMPIO_CIO_GATHER ) +#endif + + /* are the accesses of different processes interleaved? */ + for (i=1; ihints->cb_write == ADIOI_HINT_DISABLE || + (!interleave_count && (fd->hints->cb_write == ADIOI_HINT_AUTO))) + { + /* use independent accesses */ + if (fd->hints->cb_write != ADIOI_HINT_DISABLE) { + ADIOI_Free(offset_list); + ADIOI_Free(len_list); + ADIOI_Free(st_offsets); + ADIOI_Free(end_offsets); + } + + fd->fp_ind = orig_fp; + ADIOI_Datatype_iscontig(fd->filetype, &filetype_is_contig); + + if (buftype_is_contig && filetype_is_contig) { + + if (file_ptr_type == ADIO_EXPLICIT_OFFSET) { + off = fd->disp + (ADIO_Offset)(fd->etype_size) * offset; + ADIO_WriteContig(fd, buf, count, datatype, + ADIO_EXPLICIT_OFFSET, + off, status, error_code); + } + else ADIO_WriteContig(fd, buf, count, datatype, ADIO_INDIVIDUAL, + 0, status, error_code); + } + else ADIO_WriteStrided(fd, buf, count, datatype, file_ptr_type, + offset, status, error_code); + + return; + } + +#if BG_PROFILE + BGMPIO_T_CIO_SET_GET( 0, w, 1, 1, 1, BGMPIO_CIO_FD_PART, BGMPIO_CIO_PATANA ) +#endif + +/* Divide the I/O workload among "nprocs_for_coll" processes. This is + done by (logically) dividing the file into file domains (FDs); each + process may directly access only its own file domain. */ + + if (bgmpio_tuneblocking) + ADIOI_BG_GPFS_Calc_file_domains(st_offsets, end_offsets, nprocs, + nprocs_for_coll, &min_st_offset, + &fd_start, &fd_end, &fd_size, fd->fs_ptr); + else + ADIOI_Calc_file_domains(st_offsets, end_offsets, nprocs, + nprocs_for_coll, &min_st_offset, + &fd_start, &fd_end, + fd->hints->min_fdomain_size, &fd_size, + fd->hints->striping_unit); + +#if BG_PROFILE + BGMPIO_T_CIO_SET_GET( 0, w, 0, 1, 1, BGMPIO_CIO_MYREQ, BGMPIO_CIO_FD_PART ) +#endif + +/* calculate what portions of the access requests of this process are + located in what file domains */ + + if (bgmpio_tuneblocking) + ADIOI_BG_Calc_my_req(fd, offset_list, len_list, contig_access_count, + min_st_offset, fd_start, fd_end, fd_size, + nprocs, &count_my_req_procs, + &count_my_req_per_proc, &my_req, + &buf_idx); + else + ADIOI_Calc_my_req(fd, offset_list, len_list, contig_access_count, + min_st_offset, fd_start, fd_end, fd_size, + nprocs, &count_my_req_procs, + &count_my_req_per_proc, &my_req, + &buf_idx); + +#if BG_PROFILE + BGMPIO_T_CIO_SET_GET( 0, w, 1, 1, 1, BGMPIO_CIO_OTHREQ, BGMPIO_CIO_MYREQ ) +#endif + +/* based on everyone's my_req, calculate what requests of other + processes lie in this process's file domain. + count_others_req_procs = number of processes whose requests lie in + this process's file domain (including this process itself) + count_others_req_per_proc[i] indicates how many separate contiguous + requests of proc. i lie in this process's file domain. */ + + if (bgmpio_tuneblocking) + ADIOI_BG_Calc_others_req(fd, count_my_req_procs, + count_my_req_per_proc, my_req, + nprocs, myrank, + &count_others_req_procs, &others_req); + else + ADIOI_Calc_others_req(fd, count_my_req_procs, + count_my_req_per_proc, my_req, + nprocs, myrank, + &count_others_req_procs, &others_req); + +#if BG_PROFILE + BGMPIO_T_CIO_SET_GET( 0, w, 1, 1, 1, BGMPIO_CIO_DEXCH, BGMPIO_CIO_OTHREQ ) +#endif + + ADIOI_Free(count_my_req_per_proc); + for (i=0; i < nprocs; i++) { + if (my_req[i].count) { + ADIOI_Free(my_req[i].offsets); + ADIOI_Free(my_req[i].lens); + } + } + ADIOI_Free(my_req); + +/* exchange data and write in sizes of no more than coll_bufsize. */ + ADIOI_Exch_and_write(fd, buf, datatype, nprocs, myrank, + others_req, offset_list, + len_list, contig_access_count, min_st_offset, + fd_size, fd_start, fd_end, buf_idx, error_code); + +#if BG_PROFILE + BGMPIO_T_CIO_SET_GET( 0, w, 1, 0, 1, BGMPIO_CIO_LAST, BGMPIO_CIO_T_DEXCH ) + BGMPIO_T_CIO_SET_GET( 0, w, 0, 0, 1, BGMPIO_CIO_LAST, BGMPIO_CIO_T_MPIO_CRW ) + + BGMPIO_T_CIO_REPORT( 0, w, fd, myrank ) +#endif +#if 0 + /* From common code - not implemented for bg. + * + * If this collective write is followed by an independent write, + * it's possible to have those subsequent writes on other processes + * race ahead and sneak in before the read-modify-write completes. + * We carry out a collective communication at the end here so no one + * can start independent i/o before collective I/O completes. + * + * need to do some gymnastics with the error codes so that if something + * went wrong, all processes report error, but if a process has a more + * specific error code, we can still have that process report the + * additional information */ + + old_error = *error_code; + if (*error_code != MPI_SUCCESS) *error_code = MPI_ERR_IO; + + /* optimization: if only one process performing i/o, we can perform + * a less-expensive Bcast */ +#ifdef ADIOI_MPE_LOGGING + MPE_Log_event( ADIOI_MPE_postwrite_a, 0, NULL ); +#endif + if (fd->hints->cb_nodes == 1) + MPI_Bcast(error_code, 1, MPI_INT, + fd->hints->ranklist[0], fd->comm); + else { + tmp_error = *error_code; + MPI_Allreduce(&tmp_error, error_code, 1, MPI_INT, + MPI_MAX, fd->comm); + } +#ifdef ADIOI_MPE_LOGGING + MPE_Log_event( ADIOI_MPE_postwrite_b, 0, NULL ); +#endif +#ifdef AGGREGATION_PROFILE + MPE_Log_event (5012, 0, NULL); +#endif + + if ( (old_error != MPI_SUCCESS) && (old_error != MPI_ERR_IO) ) + *error_code = old_error; + + +#endif +/* free all memory allocated for collective I/O */ + if (!buftype_is_contig) ADIOI_Delete_flattened(datatype); + + for (i=0; ifp_sys_posn = -1; /* set it to null. */ +#ifdef AGGREGATION_PROFILE + MPE_Log_event (5013, 0, NULL); +#endif +} + + + +/* If successful, error_code is set to MPI_SUCCESS. Otherwise an error + * code is created and returned in error_code. + */ +static void ADIOI_Exch_and_write(ADIO_File fd, const void *buf, MPI_Datatype + datatype, int nprocs, + int myrank, + ADIOI_Access + *others_req, ADIO_Offset *offset_list, + ADIO_Offset *len_list, int contig_access_count, + ADIO_Offset min_st_offset, ADIO_Offset fd_size, + ADIO_Offset *fd_start, ADIO_Offset *fd_end, + int *buf_idx, int *error_code) +{ +/* Send data to appropriate processes and write in sizes of no more + than coll_bufsize. + The idea is to reduce the amount of extra memory required for + collective I/O. If all data were written all at once, which is much + easier, it would require temp space more than the size of user_buf, + which is often unacceptable. For example, to write a distributed + array to a file, where each local array is 8Mbytes, requiring + at least another 8Mbytes of temp space is unacceptable. */ + + /* Not convinced end_loc-st_loc couldn't be > int, so make these offsets*/ + ADIO_Offset size=0; + int hole, i, j, m, ntimes, max_ntimes, buftype_is_contig; + ADIO_Offset st_loc=-1, end_loc=-1, off, done, req_off; + char *write_buf=NULL; + int *curr_offlen_ptr, *count, *send_size, req_len, *recv_size; + int *partial_recv, *sent_to_proc, *start_pos, flag; + int *send_buf_idx, *curr_to_proc, *done_to_proc; + MPI_Status status; + ADIOI_Flatlist_node *flat_buf=NULL; + MPI_Aint buftype_extent; + int info_flag, coll_bufsize; + char *value; + static char myname[] = "ADIOI_EXCH_AND_WRITE"; + + *error_code = MPI_SUCCESS; /* changed below if error */ + /* only I/O errors are currently reported */ + +/* calculate the number of writes of size coll_bufsize + to be done by each process and the max among all processes. + That gives the no. of communication phases as well. */ + + value = (char *) ADIOI_Malloc((MPI_MAX_INFO_VAL+1)*sizeof(char)); + ADIOI_Info_get(fd->info, "cb_buffer_size", MPI_MAX_INFO_VAL, value, + &info_flag); + coll_bufsize = atoi(value); + ADIOI_Free(value); + + + for (i=0; i < nprocs; i++) { + if (others_req[i].count) { + st_loc = others_req[i].offsets[0]; + end_loc = others_req[i].offsets[0]; + break; + } + } + + for (i=0; i < nprocs; i++) + for (j=0; j < others_req[i].count; j++) { + st_loc = ADIOI_MIN(st_loc, others_req[i].offsets[j]); + end_loc = ADIOI_MAX(end_loc, (others_req[i].offsets[j] + + others_req[i].lens[j] - 1)); + } + +/* ntimes=ceiling_div(end_loc - st_loc + 1, coll_bufsize)*/ + + ntimes = (int) ((end_loc - st_loc + coll_bufsize)/coll_bufsize); + + if ((st_loc==-1) && (end_loc==-1)) { + ntimes = 0; /* this process does no writing. */ + } + + MPI_Allreduce(&ntimes, &max_ntimes, 1, MPI_INT, MPI_MAX, + fd->comm); + + if (ntimes) write_buf = (char *) ADIOI_Malloc(coll_bufsize); + + curr_offlen_ptr = (int *) ADIOI_Calloc(nprocs, sizeof(int)); + /* its use is explained below. calloc initializes to 0. */ + + count = (int *) ADIOI_Malloc(nprocs*sizeof(int)); + /* to store count of how many off-len pairs per proc are satisfied + in an iteration. */ + + partial_recv = (int *) ADIOI_Calloc(nprocs, sizeof(int)); + /* if only a portion of the last off-len pair is recd. from a process + in a particular iteration, the length recd. is stored here. + calloc initializes to 0. */ + + send_size = (int *) ADIOI_Malloc(nprocs*sizeof(int)); + /* total size of data to be sent to each proc. in an iteration. + Of size nprocs so that I can use MPI_Alltoall later. */ + + recv_size = (int *) ADIOI_Malloc(nprocs*sizeof(int)); + /* total size of data to be recd. from each proc. in an iteration.*/ + + sent_to_proc = (int *) ADIOI_Calloc(nprocs, sizeof(int)); + /* amount of data sent to each proc so far. Used in + ADIOI_Fill_send_buffer. initialized to 0 here. */ + + send_buf_idx = (int *) ADIOI_Malloc(nprocs*sizeof(int)); + curr_to_proc = (int *) ADIOI_Malloc(nprocs*sizeof(int)); + done_to_proc = (int *) ADIOI_Malloc(nprocs*sizeof(int)); + /* Above three are used in ADIOI_Fill_send_buffer*/ + + start_pos = (int *) ADIOI_Malloc(nprocs*sizeof(int)); + /* used to store the starting value of curr_offlen_ptr[i] in + this iteration */ + + ADIOI_Datatype_iscontig(datatype, &buftype_is_contig); + if (!buftype_is_contig) { + ADIOI_Flatten_datatype(datatype); + flat_buf = ADIOI_Flatlist; + while (flat_buf->type != datatype) flat_buf = flat_buf->next; + } + MPI_Type_extent(datatype, &buftype_extent); + + +/* I need to check if there are any outstanding nonblocking writes to + the file, which could potentially interfere with the writes taking + place in this collective write call. Since this is not likely to be + common, let me do the simplest thing possible here: Each process + completes all pending nonblocking operations before completing. */ + + /*ADIOI_Complete_async(error_code); + if (*error_code != MPI_SUCCESS) return; + MPI_Barrier(fd->comm); + */ + + done = 0; + off = st_loc; + +#ifdef PROFILE + MPE_Log_event(14, 0, "end computation"); +#endif + + for (m=0; m < ntimes; m++) { + /* go through all others_req and check which will be satisfied + by the current write */ + + /* Note that MPI guarantees that displacements in filetypes are in + monotonically nondecreasing order and that, for writes, the + filetypes cannot specify overlapping regions in the file. This + simplifies implementation a bit compared to reads. */ + + /* off = start offset in the file for the data to be written in + this iteration + size = size of data written (bytes) corresponding to off + req_off = off in file for a particular contiguous request + minus what was satisfied in previous iteration + req_size = size corresponding to req_off */ + + /* first calculate what should be communicated */ + +#ifdef PROFILE + MPE_Log_event(13, 0, "start computation"); +#endif + for (i=0; i < nprocs; i++) count[i] = recv_size[i] = 0; + + size = ADIOI_MIN((unsigned)coll_bufsize, end_loc-st_loc+1-done); + + for (i=0; i < nprocs; i++) { + if (others_req[i].count) { + start_pos[i] = curr_offlen_ptr[i]; + for (j=curr_offlen_ptr[i]; jcomm); + + /* create derived datatypes for recv */ + + nprocs_recv = 0; + for (i=0; i srt_len[0]) srt_len[0] = new_len; + } + else + break; + } + if (i < sum || size != srt_len[0]) /* hole in middle or end */ + *hole = 1; + } + + ADIOI_Free(srt_off); + ADIOI_Free(srt_len); + + if (nprocs_recv) { + if (*hole) { + ADIO_ReadContig(fd, write_buf, size, MPI_BYTE, + ADIO_EXPLICIT_OFFSET, off, &status, &err); + /* --BEGIN ERROR HANDLING-- */ + if (err != MPI_SUCCESS) { + *error_code = MPIO_Err_create_code(err, + MPIR_ERR_RECOVERABLE, myname, + __LINE__, MPI_ERR_IO, + "**ioRMWrdwr", 0); + return; + } + /* --END ERROR HANDLING-- */ + } + } + + nprocs_send = 0; + for (i=0; i < nprocs; i++) if (send_size[i]) nprocs_send++; + + if (fd->atomicity) { + /* bug fix from Wei-keng Liao and Kenin Coloma */ + requests = (MPI_Request *) + ADIOI_Malloc((nprocs_send+1)*sizeof(MPI_Request)); + send_req = requests; + } + else { + requests = (MPI_Request *) + ADIOI_Malloc((nprocs_send+nprocs_recv+1)*sizeof(MPI_Request)); + /* +1 to avoid a 0-size malloc */ + + /* post receives */ + j = 0; + for (i=0; icomm, requests+j); + j++; + } + } + send_req = requests + nprocs_recv; + } + +/* post sends. if buftype_is_contig, data can be directly sent from + user buf at location given by buf_idx. else use send_buf. */ + +#ifdef AGGREGATION_PROFILE + MPE_Log_event (5032, 0, NULL); +#endif + if (buftype_is_contig) { + j = 0; + for (i=0; i < nprocs; i++) + if (send_size[i]) { + MPI_Isend(((char *) buf) + buf_idx[i], send_size[i], + MPI_BYTE, i, myrank+i+100*iter, fd->comm, + send_req+j); + j++; + buf_idx[i] += send_size[i]; + } + } + else if (nprocs_send) { + /* buftype is not contig */ + send_buf = (char **) ADIOI_Malloc(nprocs*sizeof(char*)); + for (i=0; i < nprocs; i++) + if (send_size[i]) + send_buf[i] = (char *) ADIOI_Malloc(send_size[i]); + + ADIOI_Fill_send_buffer(fd, buf, flat_buf, send_buf, + offset_list, len_list, send_size, + send_req, + sent_to_proc, nprocs, myrank, + contig_access_count, + min_st_offset, fd_size, fd_start, fd_end, + send_buf_idx, curr_to_proc, done_to_proc, iter, + buftype_extent); + /* the send is done in ADIOI_Fill_send_buffer */ + } + + if (fd->atomicity) { + /* bug fix from Wei-keng Liao and Kenin Coloma */ + j = 0; + for (i=0; icomm, &wkl_status); + j++; + } + } + } + + for (i=0; iatomicity) { + /* bug fix from Wei-keng Liao and Kenin Coloma */ + statuses = (MPI_Status *) ADIOI_Malloc((nprocs_send+1) * \ + sizeof(MPI_Status)); + /* +1 to avoid a 0-size malloc */ + } + else { + statuses = (MPI_Status *) ADIOI_Malloc((nprocs_send+nprocs_recv+1) * \ + sizeof(MPI_Status)); + /* +1 to avoid a 0-size malloc */ + } + +#ifdef NEEDS_MPI_TEST + i = 0; + if (fd->atomicity) { + /* bug fix from Wei-keng Liao and Kenin Coloma */ + while (!i) MPI_Testall(nprocs_send, send_req, &i, statuses); + } + else { + while (!i) MPI_Testall(nprocs_send+nprocs_recv, requests, &i, statuses); + } +#else + if (fd->atomicity) + /* bug fix from Wei-keng Liao and Kenin Coloma */ + MPI_Waitall(nprocs_send, send_req, statuses); + else + MPI_Waitall(nprocs_send+nprocs_recv, requests, statuses); +#endif + +#ifdef AGGREGATION_PROFILE + MPE_Log_event (5033, 0, NULL); +#endif + ADIOI_Free(statuses); + ADIOI_Free(requests); + if (!buftype_is_contig && nprocs_send) { + for (i=0; i < nprocs; i++) + if (send_size[i]) ADIOI_Free(send_buf[i]); + ADIOI_Free(send_buf); + } +} + + +#define ADIOI_BUF_INCR \ +{ \ + while (buf_incr) { \ + size_in_buf = ADIOI_MIN(buf_incr, flat_buf_sz); \ + user_buf_idx += size_in_buf; \ + flat_buf_sz -= size_in_buf; \ + if (!flat_buf_sz) { \ + if (flat_buf_idx < (flat_buf->count - 1)) flat_buf_idx++; \ + else { \ + flat_buf_idx = 0; \ + n_buftypes++; \ + } \ + user_buf_idx = flat_buf->indices[flat_buf_idx] + \ + (ADIO_Offset)n_buftypes*(ADIO_Offset)buftype_extent; \ + flat_buf_sz = flat_buf->blocklens[flat_buf_idx]; \ + } \ + buf_incr -= size_in_buf; \ + } \ +} + + +#define ADIOI_BUF_COPY \ +{ \ + while (size) { \ + size_in_buf = ADIOI_MIN(size, flat_buf_sz); \ + ADIOI_Assert((((ADIO_Offset)(MPIR_Upint)buf) + user_buf_idx) == (ADIO_Offset)(MPIR_Upint)((MPIR_Upint)buf + user_buf_idx)); \ + ADIOI_Assert(size_in_buf == (size_t)size_in_buf); \ + memcpy(&(send_buf[p][send_buf_idx[p]]), \ + ((char *) buf) + user_buf_idx, size_in_buf); \ + send_buf_idx[p] += size_in_buf; \ + user_buf_idx += size_in_buf; \ + flat_buf_sz -= size_in_buf; \ + if (!flat_buf_sz) { \ + if (flat_buf_idx < (flat_buf->count - 1)) flat_buf_idx++; \ + else { \ + flat_buf_idx = 0; \ + n_buftypes++; \ + } \ + user_buf_idx = flat_buf->indices[flat_buf_idx] + \ + (ADIO_Offset)n_buftypes*(ADIO_Offset)buftype_extent; \ + flat_buf_sz = flat_buf->blocklens[flat_buf_idx]; \ + } \ + size -= size_in_buf; \ + buf_incr -= size_in_buf; \ + } \ + ADIOI_BUF_INCR \ +} + +static void ADIOI_Fill_send_buffer(ADIO_File fd, const void *buf, ADIOI_Flatlist_node + *flat_buf, char **send_buf, ADIO_Offset + *offset_list, ADIO_Offset *len_list, int *send_size, + MPI_Request *requests, int *sent_to_proc, + int nprocs, int myrank, + int contig_access_count, + ADIO_Offset min_st_offset, ADIO_Offset fd_size, + ADIO_Offset *fd_start, ADIO_Offset *fd_end, + int *send_buf_idx, int *curr_to_proc, + int *done_to_proc, int iter, + MPI_Aint buftype_extent) +{ +/* this function is only called if buftype is not contig */ + + int i, p, flat_buf_idx; + ADIO_Offset flat_buf_sz, size_in_buf, buf_incr, size; + int jj, n_buftypes; + ADIO_Offset off, len, rem_len, user_buf_idx; + +/* curr_to_proc[p] = amount of data sent to proc. p that has already + been accounted for so far + done_to_proc[p] = amount of data already sent to proc. p in + previous iterations + user_buf_idx = current location in user buffer + send_buf_idx[p] = current location in send_buf of proc. p */ + + for (i=0; i < nprocs; i++) { + send_buf_idx[i] = curr_to_proc[i] = 0; + done_to_proc[i] = sent_to_proc[i]; + } + jj = 0; + + user_buf_idx = flat_buf->indices[0]; + flat_buf_idx = 0; + n_buftypes = 0; + flat_buf_sz = flat_buf->blocklens[0]; + + /* flat_buf_idx = current index into flattened buftype + flat_buf_sz = size of current contiguous component in + flattened buf */ + + for (i=0; i done_to_proc[p]) { + if (done_to_proc[p] > curr_to_proc[p]) { + size = ADIOI_MIN(curr_to_proc[p] + len - + done_to_proc[p], send_size[p]-send_buf_idx[p]); + buf_incr = done_to_proc[p] - curr_to_proc[p]; + ADIOI_BUF_INCR + ADIOI_Assert((curr_to_proc[p] + len - done_to_proc[p]) == (unsigned)(curr_to_proc[p] + len - done_to_proc[p])); + buf_incr = curr_to_proc[p] + len - done_to_proc[p]; + ADIOI_Assert((done_to_proc[p] + size) == (unsigned)(done_to_proc[p] + size)); + curr_to_proc[p] = done_to_proc[p] + size; + ADIOI_BUF_COPY + } + else { + size = ADIOI_MIN(len,send_size[p]-send_buf_idx[p]); + buf_incr = len; + ADIOI_Assert((curr_to_proc[p] + size) == (unsigned)((ADIO_Offset)curr_to_proc[p] + size)); + curr_to_proc[p] += size; + ADIOI_BUF_COPY + } + if (send_buf_idx[p] == send_size[p]) { + MPI_Isend(send_buf[p], send_size[p], MPI_BYTE, p, + myrank+p+100*iter, fd->comm, requests+jj); + jj++; + } + } + else { + ADIOI_Assert((curr_to_proc[p] + len) == (unsigned)((ADIO_Offset)curr_to_proc[p] + len)); + curr_to_proc[p] += len; + buf_incr = len; + ADIOI_BUF_INCR + } + } + else { + buf_incr = len; + ADIOI_BUF_INCR + } + off += len; + rem_len -= len; + } + } + for (i=0; i < nprocs; i++) + if (send_size[i]) sent_to_proc[i] = curr_to_proc[i]; +} + + + +static void ADIOI_Heap_merge(ADIOI_Access *others_req, int *count, + ADIO_Offset *srt_off, int *srt_len, int *start_pos, + int nprocs, int nprocs_recv, int total_elements) +{ + typedef struct { + ADIO_Offset *off_list; + int *len_list; + int nelem; + } heap_struct; + + heap_struct *a, tmp; + int i, j, heapsize, l, r, k, smallest; + + a = (heap_struct *) ADIOI_Malloc((nprocs_recv+1)*sizeof(heap_struct)); + + j = 0; + for (i=0; i=0; i--) { + /* Heapify(a, i, heapsize); Algorithm from Cormen et al. pg. 143 + modified for a heap with smallest element at root. I have + removed the recursion so that there are no function calls. + Function calls are too expensive. */ + k = i; + while (1) { + l = 2*(k+1) - 1; + r = 2*(k+1); + + if ((l < heapsize) && + (*(a[l].off_list) < *(a[k].off_list))) + smallest = l; + else smallest = k; + + if ((r < heapsize) && + (*(a[r].off_list) < *(a[smallest].off_list))) + smallest = r; + + if (smallest != k) { + tmp.off_list = a[k].off_list; + tmp.len_list = a[k].len_list; + tmp.nelem = a[k].nelem; + + a[k].off_list = a[smallest].off_list; + a[k].len_list = a[smallest].len_list; + a[k].nelem = a[smallest].nelem; + + a[smallest].off_list = tmp.off_list; + a[smallest].len_list = tmp.len_list; + a[smallest].nelem = tmp.nelem; + + k = smallest; + } + else break; + } + } + + for (i=0; icomm); + + nprocs_recv = 0; + for (i=0; icomm ); + + /* data sieving pre-read */ + /* To avoid a read-modify-write, check if there are holes in the + data to be written. For this, merge the (sorted) offset lists + others_req using a heap-merge. */ + + sum = 0; + for (i=0; i off) || + ((srt_off[sum-1] + srt_len[sum-1]) < (off + size))) + { + *hole = 1; + } + else /* See if there are holes between the requests, if there are more than one */ + for (i=0; iindices[0]; + flat_buf_idx = 0; + n_buftypes = 0; + flat_buf_sz = flat_buf->blocklens[0]; + + /* flat_buf_idx = current index into flattened buftype + flat_buf_sz = size of current contiguous component in + flattened buf */ + + for (i=0; i done_to_proc[p]) { + if (done_to_proc[p] > curr_to_proc[p]) { + size = ADIOI_MIN(curr_to_proc[p] + len - + done_to_proc[p], send_size[p]-send_buf_idx[p]); + buf_incr = done_to_proc[p] - curr_to_proc[p]; + ADIOI_BUF_INCR + ADIOI_Assert((curr_to_proc[p] + len - done_to_proc[p]) == (unsigned)(curr_to_proc[p] + len - done_to_proc[p])); + buf_incr = curr_to_proc[p] + len - done_to_proc[p]; + ADIOI_Assert((done_to_proc[p] + size) == (unsigned)(done_to_proc[p] + size)); + curr_to_proc[p] = done_to_proc[p] + size; + ADIOI_BUF_COPY + } + else { + size = ADIOI_MIN(len,send_size[p]-send_buf_idx[p]); + buf_incr = len; + ADIOI_Assert((curr_to_proc[p] + size) == (unsigned)((ADIO_Offset)curr_to_proc[p] + size)); + curr_to_proc[p] += size; + ADIOI_BUF_COPY + } + /* moved to alltoallv */ + /* + if (send_buf_idx[p] == send_size[p]) { + MPI_Isend(send_buf[p], send_size[p], MPI_BYTE, p, + myrank+p+100*iter, fd->comm, requests+jj); + jj++; + } + */ + } + else { + ADIOI_Assert((curr_to_proc[p] + len) == (unsigned)((ADIO_Offset)curr_to_proc[p] + len)); + curr_to_proc[p] += (int)len; + buf_incr = len; + ADIOI_BUF_INCR + } + } + else { + buf_incr = len; + ADIOI_BUF_INCR + } + off += len; + rem_len -= len; + } + } + for (i=0; i < nprocs; i++) + if (send_size[i]) sent_to_proc[i] = curr_to_proc[i]; +} diff --git a/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_write.c b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_write.c new file mode 100644 index 0000000000..12dbfb19c5 --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_bg/ad_bg_write.c @@ -0,0 +1,611 @@ +/* ---------------------------------------------------------------- */ +/* (C)Copyright IBM Corp. 2007, 2008 */ +/* ---------------------------------------------------------------- */ +/** + * \file ad_bg_write.c + * \brief ??? + */ + +/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* + * Copyright (C) 1997 University of Chicago. + * See COPYRIGHT notice in top-level directory. + */ + +#include "ad_bg.h" +#include "adio_extern.h" + +#include "ad_bg_tuning.h" + +#ifdef AGGREGATION_PROFILE +#include "mpe.h" +#endif + +void ADIOI_BG_WriteContig(ADIO_File fd, const void *buf, int count, + MPI_Datatype datatype, int file_ptr_type, + ADIO_Offset offset, ADIO_Status *status, int *error_code) +{ + int err=-1, datatype_size; + ADIO_Offset len; + static char myname[] = "ADIOI_BG_WRITECONTIG"; +#ifdef AGGREGATION_PROFILE + MPE_Log_event (5036, 0, NULL); +#endif +#if BG_PROFILE + /* timing */ + double io_time, io_time2; + + if (bgmpio_timing) { + io_time = MPI_Wtime(); + bgmpio_prof_cw[ BGMPIO_CIO_DATA_SIZE ] += len; + } +#endif + + MPI_Type_size(datatype, &datatype_size); + len = (ADIO_Offset)datatype_size * (ADIO_Offset)count; + ADIOI_Assert(len == (unsigned int) len); /* write takes an unsigned int parm */ + +#if BG_PROFILE + + if (file_ptr_type == ADIO_EXPLICIT_OFFSET) { + if (bgmpio_timing2) io_time2 = MPI_Wtime(); + if (fd->fp_sys_posn != offset) + lseek(fd->fd_sys, offset, SEEK_SET); + if (bgmpio_timing2) bgmpio_prof_cw[ BGMPIO_CIO_T_SEEK ] += (MPI_Wtime() - io_time2); + ADIOI_WRITE_LOCK(fd, offset, SEEK_SET, len); + if (bgmpio_timing2) io_time2 = MPI_Wtime(); + err = write(fd->fd_sys, buf, (unsigned int)len); + if (bgmpio_timing2) bgmpio_prof_cw[ BGMPIO_CIO_T_POSI_RW ] += (MPI_Wtime() - io_time2); + ADIOI_UNLOCK(fd, offset, SEEK_SET, len); + fd->fp_sys_posn = offset + err; + /* individual file pointer not updated */ + } + else { /* write from curr. location of ind. file pointer */ + offset = fd->fp_ind; + if (bgmpio_timing2) io_time2 = MPI_Wtime(); + if (fd->fp_sys_posn != fd->fp_ind) + lseek(fd->fd_sys, fd->fp_ind, SEEK_SET); + if (bgmpio_timing2) bgmpio_prof_cw[ BGMPIO_CIO_T_SEEK ] += (MPI_Wtime() - io_time2); + ADIOI_WRITE_LOCK(fd, offset, SEEK_SET, len); + if (bgmpio_timing2) io_time2 = MPI_Wtime(); + err = write(fd->fd_sys, buf, (unsigned int)len); + if (bgmpio_timing2) bgmpio_prof_cw[ BGMPIO_CIO_T_POSI_RW ] += (MPI_Wtime() - io_time2); + ADIOI_UNLOCK(fd, offset, SEEK_SET, len); + fd->fp_ind += err; + fd->fp_sys_posn = fd->fp_ind; + } + +#else /* BG_PROFILE */ + + if (file_ptr_type == ADIO_EXPLICIT_OFFSET) { + if (fd->fp_sys_posn != offset) + lseek(fd->fd_sys, offset, SEEK_SET); + ADIOI_WRITE_LOCK(fd, offset, SEEK_SET, len); + err = write(fd->fd_sys, buf, (unsigned int)len); + ADIOI_UNLOCK(fd, offset, SEEK_SET, len); + fd->fp_sys_posn = offset + err; + /* individual file pointer not updated */ + } + else { /* write from curr. location of ind. file pointer */ + offset = fd->fp_ind; + if (fd->fp_sys_posn != fd->fp_ind) + lseek(fd->fd_sys, fd->fp_ind, SEEK_SET); + ADIOI_WRITE_LOCK(fd, offset, SEEK_SET, len); + err = write(fd->fd_sys, buf, (unsigned int)len); + ADIOI_UNLOCK(fd, offset, SEEK_SET, len); + fd->fp_ind += err; + fd->fp_sys_posn = fd->fp_ind; + } + +#endif /* BG_PROFILE */ + +#if BG_PROFILE + if (bgmpio_timing) bgmpio_prof_cw[ BGMPIO_CIO_T_MPIO_RW ] += (MPI_Wtime() - io_time); +#endif + + /* --BEGIN ERROR HANDLING-- */ + if (err == -1) { + *error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, + myname, __LINE__, MPI_ERR_IO, + "**io", + "**io %s", strerror(errno)); + return; + } + /* --END ERROR HANDLING-- */ + +#ifdef HAVE_STATUS_SET_BYTES + MPIR_Status_set_bytes(status, datatype, err); +#endif + + *error_code = MPI_SUCCESS; +#ifdef AGGREGATION_PROFILE + MPE_Log_event (5037, 0, NULL); +#endif +} + + +#define ADIOI_BUFFERED_WRITE \ +{ \ + if (req_off >= writebuf_off + writebuf_len) { \ + lseek(fd->fd_sys, writebuf_off, SEEK_SET); \ + err = write(fd->fd_sys, writebuf, writebuf_len); \ + if (!(fd->atomicity)) ADIOI_UNLOCK(fd, writebuf_off, SEEK_SET, writebuf_len); \ + if (err == -1) err_flag = 1; \ + writebuf_off = req_off; \ + writebuf_len = (unsigned) (ADIOI_MIN(max_bufsize,end_offset-writebuf_off+1));\ + if (!(fd->atomicity)) ADIOI_WRITE_LOCK(fd, writebuf_off, SEEK_SET, writebuf_len); \ + lseek(fd->fd_sys, writebuf_off, SEEK_SET); \ + err = read(fd->fd_sys, writebuf, writebuf_len); \ + if (err == -1) { \ + *error_code = MPIO_Err_create_code(MPI_SUCCESS, \ + MPIR_ERR_RECOVERABLE, myname, \ + __LINE__, MPI_ERR_IO, \ + "**ioRMWrdwr", 0); \ + return; \ + } \ + } \ + write_sz = (unsigned) (ADIOI_MIN(req_len, writebuf_off + writebuf_len - req_off)); \ + ADIOI_Assert((ADIO_Offset)write_sz == ADIOI_MIN(req_len, writebuf_off + writebuf_len - req_off));\ + memcpy(writebuf+req_off-writebuf_off, (char *)buf +userbuf_off, write_sz);\ + while (write_sz != req_len) { \ + lseek(fd->fd_sys, writebuf_off, SEEK_SET); \ + err = write(fd->fd_sys, writebuf, writebuf_len); \ + if (!(fd->atomicity)) ADIOI_UNLOCK(fd, writebuf_off, SEEK_SET, writebuf_len); \ + if (err == -1) err_flag = 1; \ + req_len -= write_sz; \ + userbuf_off += write_sz; \ + writebuf_off += writebuf_len; \ + writebuf_len = (unsigned) (ADIOI_MIN(max_bufsize,end_offset-writebuf_off+1));\ + if (!(fd->atomicity)) ADIOI_WRITE_LOCK(fd, writebuf_off, SEEK_SET, writebuf_len); \ + lseek(fd->fd_sys, writebuf_off, SEEK_SET); \ + err = read(fd->fd_sys, writebuf, writebuf_len); \ + if (err == -1) { \ + *error_code = MPIO_Err_create_code(MPI_SUCCESS, \ + MPIR_ERR_RECOVERABLE, myname, \ + __LINE__, MPI_ERR_IO, \ + "**ioRMWrdwr", 0); \ + return; \ + } \ + write_sz = ADIOI_MIN(req_len, writebuf_len); \ + memcpy(writebuf, (char *)buf + userbuf_off, write_sz);\ + } \ +} + + +/* this macro is used when filetype is contig and buftype is not contig. + it does not do a read-modify-write and does not lock*/ +#define ADIOI_BUFFERED_WRITE_WITHOUT_READ \ +{ \ + if (req_off >= writebuf_off + writebuf_len) { \ + lseek(fd->fd_sys, writebuf_off, SEEK_SET); \ + if (!(fd->atomicity)) ADIOI_WRITE_LOCK(fd, writebuf_off, SEEK_SET, writebuf_len); \ + err = write(fd->fd_sys, writebuf, writebuf_len); \ + if (!(fd->atomicity)) ADIOI_UNLOCK(fd, writebuf_off, SEEK_SET, writebuf_len); \ + if (err == -1) err_flag = 1; \ + writebuf_off = req_off; \ + writebuf_len = (unsigned) (ADIOI_MIN(max_bufsize,end_offset-writebuf_off+1));\ + } \ + write_sz = (unsigned) (ADIOI_MIN(req_len, writebuf_off + writebuf_len - req_off)); \ + ADIOI_Assert((ADIO_Offset)write_sz == ADIOI_MIN(req_len, writebuf_off + writebuf_len - req_off));\ + memcpy(writebuf+req_off-writebuf_off, (char *)buf +userbuf_off, write_sz);\ + while (write_sz != req_len) { \ + lseek(fd->fd_sys, writebuf_off, SEEK_SET); \ + if (!(fd->atomicity)) ADIOI_WRITE_LOCK(fd, writebuf_off, SEEK_SET, writebuf_len); \ + err = write(fd->fd_sys, writebuf, writebuf_len); \ + if (!(fd->atomicity)) ADIOI_UNLOCK(fd, writebuf_off, SEEK_SET, writebuf_len); \ + if (err == -1) err_flag = 1; \ + req_len -= write_sz; \ + userbuf_off += write_sz; \ + writebuf_off += writebuf_len; \ + writebuf_len = (unsigned) (ADIOI_MIN(max_bufsize,end_offset-writebuf_off+1));\ + write_sz = ADIOI_MIN(req_len, writebuf_len); \ + memcpy(writebuf, (char *)buf + userbuf_off, write_sz);\ + } \ +} + + + +void ADIOI_BG_WriteStrided(ADIO_File fd, const void *buf, int count, + MPI_Datatype datatype, int file_ptr_type, + ADIO_Offset offset, ADIO_Status *status, int + *error_code) +{ +/* offset is in units of etype relative to the filetype. */ + + + + ADIOI_Flatlist_node *flat_buf, *flat_file; + ADIO_Offset i_offset, sum, size_in_filetype; + int i, j, k, err=-1, st_index=0; + int n_etypes_in_filetype; + ADIO_Offset num, size, n_filetypes, etype_in_filetype, st_n_filetypes; + ADIO_Offset abs_off_in_filetype=0; + int filetype_size, etype_size, buftype_size; + MPI_Aint filetype_extent, buftype_extent; + int buf_count, buftype_is_contig, filetype_is_contig; + ADIO_Offset userbuf_off; + ADIO_Offset off, req_off, disp, end_offset=0, writebuf_off, start_off; + char *writebuf, *value; + unsigned bufsize, writebuf_len, max_bufsize, write_sz; + int err_flag=0, info_flag; + ADIO_Offset new_bwr_size, new_fwr_size, st_fwr_size, fwr_size=0, bwr_size, req_len; + static char myname[] = "ADIOI_BG_WRITESTRIDED"; + + if (fd->hints->ds_write == ADIOI_HINT_DISABLE) { + /* if user has disabled data sieving on reads, use naive + * approach instead. + */ + /*FPRINTF(stderr, "ADIOI_GEN_WriteStrided_naive(%d):\n", __LINE__);*/ + ADIOI_GEN_WriteStrided_naive(fd, + buf, + count, + datatype, + file_ptr_type, + offset, + status, + error_code); + return; + } + /*FPRINTF(stderr, "%s(%d):\n",myname, __LINE__);*/ + + ADIOI_Datatype_iscontig(datatype, &buftype_is_contig); + ADIOI_Datatype_iscontig(fd->filetype, &filetype_is_contig); + + MPI_Type_size(fd->filetype, &filetype_size); + if ( ! filetype_size ) { +#ifdef HAVE_STATUS_SET_BYTES + MPIR_Status_set_bytes(status, datatype, 0); +#endif + *error_code = MPI_SUCCESS; + return; + } + + MPI_Type_extent(fd->filetype, &filetype_extent); + MPI_Type_size(datatype, &buftype_size); + MPI_Type_extent(datatype, &buftype_extent); + etype_size = fd->etype_size; + + ADIOI_Assert((buftype_size * count) == ((ADIO_Offset)(unsigned)buftype_size * (ADIO_Offset)count)); + bufsize = buftype_size * count; + +/* get max_bufsize from the info object. */ + + value = (char *) ADIOI_Malloc((MPI_MAX_INFO_VAL+1)*sizeof(char)); + ADIOI_Info_get(fd->info, "ind_wr_buffer_size", MPI_MAX_INFO_VAL, value, + &info_flag); + max_bufsize = atoi(value); + ADIOI_Free(value); + + if (!buftype_is_contig && filetype_is_contig) { + +/* noncontiguous in memory, contiguous in file. */ + + ADIOI_Flatten_datatype(datatype); + flat_buf = ADIOI_Flatlist; + while (flat_buf->type != datatype) flat_buf = flat_buf->next; + + off = (file_ptr_type == ADIO_INDIVIDUAL) ? fd->fp_ind : + fd->disp + etype_size * offset; + + start_off = off; + end_offset = off + bufsize - 1; + writebuf_off = off; + writebuf = (char *) ADIOI_Malloc(max_bufsize); + writebuf_len = (unsigned) (ADIOI_MIN(max_bufsize,end_offset-writebuf_off+1)); + +/* if atomicity is true, lock the region to be accessed */ + if (fd->atomicity) + ADIOI_WRITE_LOCK(fd, start_off, SEEK_SET, end_offset-start_off+1); + + for (j=0; jcount; i++) { + userbuf_off = (ADIO_Offset)j*(ADIO_Offset)buftype_extent + flat_buf->indices[i]; + req_off = off; + req_len = flat_buf->blocklens[i]; + ADIOI_BUFFERED_WRITE_WITHOUT_READ + off += flat_buf->blocklens[i]; + } + } + + /* write the buffer out finally */ + lseek(fd->fd_sys, writebuf_off, SEEK_SET); + if (!(fd->atomicity)) ADIOI_WRITE_LOCK(fd, writebuf_off, SEEK_SET, writebuf_len); + err = write(fd->fd_sys, writebuf, writebuf_len); + if (!(fd->atomicity)) ADIOI_UNLOCK(fd, writebuf_off, SEEK_SET, writebuf_len); + if (err == -1) err_flag = 1; + + if (fd->atomicity) + ADIOI_UNLOCK(fd, start_off, SEEK_SET, end_offset-start_off+1); + + ADIOI_Free(writebuf); /* malloced in the buffered_write macro */ + + if (file_ptr_type == ADIO_INDIVIDUAL) fd->fp_ind = off; + if (err_flag) { + *error_code = MPIO_Err_create_code(MPI_SUCCESS, + MPIR_ERR_RECOVERABLE, myname, + __LINE__, MPI_ERR_IO, "**io", + "**io %s", strerror(errno)); + } + else *error_code = MPI_SUCCESS; + } + + else { /* noncontiguous in file */ + +/* filetype already flattened in ADIO_Open */ + flat_file = ADIOI_Flatlist; + while (flat_file->type != fd->filetype) flat_file = flat_file->next; + disp = fd->disp; + + if (file_ptr_type == ADIO_INDIVIDUAL) { + /* Wei-keng reworked type processing to be a bit more efficient */ + offset = fd->fp_ind - disp; + n_filetypes = (offset - flat_file->indices[0]) / filetype_extent; + offset -= (ADIO_Offset)n_filetypes * filetype_extent; + /* now offset is local to this extent */ + + /* find the block where offset is located, skip blocklens[i]==0 */ + for (i=0; icount; i++) { + ADIO_Offset dist; + if (flat_file->blocklens[i] == 0) continue; + dist = flat_file->indices[i] + flat_file->blocklens[i] - offset; + /* fwr_size is from offset to the end of block i */ + if (dist == 0) { + i++; + offset = flat_file->indices[i]; + fwr_size = flat_file->blocklens[i]; + break; + } + if (dist > 0) { + fwr_size = dist; + break; + } + } + st_index = i; /* starting index in flat_file->indices[] */ + offset += disp + (ADIO_Offset)n_filetypes*filetype_extent; + } + else { + int i; + n_etypes_in_filetype = filetype_size/etype_size; + n_filetypes = offset / n_etypes_in_filetype; + etype_in_filetype = offset % n_etypes_in_filetype; + size_in_filetype = etype_in_filetype * etype_size; + + sum = 0; + for (i=0; icount; i++) { + sum += flat_file->blocklens[i]; + if (sum > size_in_filetype) { + st_index = i; + fwr_size = sum - size_in_filetype; + abs_off_in_filetype = flat_file->indices[i] + + size_in_filetype - (sum - flat_file->blocklens[i]); + break; + } + } + + /* abs. offset in bytes in the file */ + offset = disp + (ADIO_Offset) n_filetypes*filetype_extent + + abs_off_in_filetype; + } + + start_off = offset; + /* Wei-keng Liao:write request is within single flat_file contig block*/ + /* this could happen, for example, with subarray types that are + * actually fairly contiguous */ + if (buftype_is_contig && bufsize <= fwr_size) { + ADIO_WriteContig(fd, buf, bufsize, MPI_BYTE, ADIO_EXPLICIT_OFFSET, + offset, status, error_code); + + if (file_ptr_type == ADIO_INDIVIDUAL) { + /* update MPI-IO file pointer to point to the first byte + * that can be accessed in the fileview. */ + fd->fp_ind = offset + bufsize; + if (bufsize == fwr_size) { + do { + st_index++; + if (st_index == flat_file->count) { + st_index = 0; + n_filetypes++; + } + } while (flat_file->blocklens[st_index] == 0); + fd->fp_ind = disp + flat_file->indices[st_index] + + (ADIO_Offset)n_filetypes*filetype_extent; + } + } + fd->fp_sys_posn = -1; /* set it to null. */ +#ifdef HAVE_STATUS_SET_BYTES + MPIR_Status_set_bytes(status, datatype, bufsize); +#endif + return; + } + + /* Calculate end_offset, the last byte-offset that will be accessed. + e.g., if start_offset=0 and 100 bytes to be write, end_offset=99*/ + + st_fwr_size = fwr_size; + st_n_filetypes = n_filetypes; + i_offset = 0; + j = st_index; + off = offset; + fwr_size = ADIOI_MIN(st_fwr_size, bufsize); + while (i_offset < bufsize) { + i_offset += fwr_size; + end_offset = off + fwr_size - 1; + + j = (j+1) % flat_file->count; + n_filetypes += (j == 0) ? 1 : 0; + while (flat_file->blocklens[j]==0) { + j = (j+1) % flat_file->count; + n_filetypes += (j == 0) ? 1 : 0; + } + + off = disp + flat_file->indices[j] + + n_filetypes*(ADIO_Offset)filetype_extent; + fwr_size = ADIOI_MIN(flat_file->blocklens[j], bufsize-i_offset); + } + +/* if atomicity is true, lock the region to be accessed */ + if (fd->atomicity) + ADIOI_WRITE_LOCK(fd, start_off, SEEK_SET, end_offset-start_off+1); + + /* initial read for the read-modify-write */ + writebuf_off = offset; + writebuf = (char *) ADIOI_Malloc(max_bufsize); + writebuf_len = (unsigned)(ADIOI_MIN(max_bufsize,end_offset-writebuf_off+1)); + if (!(fd->atomicity)) ADIOI_WRITE_LOCK(fd, writebuf_off, SEEK_SET, writebuf_len); + lseek(fd->fd_sys, writebuf_off, SEEK_SET); + err = read(fd->fd_sys, writebuf, writebuf_len); + if (err == -1) { + *error_code = MPIO_Err_create_code(MPI_SUCCESS, + MPIR_ERR_RECOVERABLE, + myname, __LINE__, + MPI_ERR_IO, + "ADIOI_BG_WriteStrided: ROMIO tries to optimize this access by doing a read-modify-write, but is unable to read the file. Please give the file read permission and open it with MPI_MODE_RDWR.", 0); + return; + } + + if (buftype_is_contig && !filetype_is_contig) { + +/* contiguous in memory, noncontiguous in file. should be the most + common case. */ + + i_offset = 0; + j = st_index; + off = offset; + n_filetypes = st_n_filetypes; + fwr_size = ADIOI_MIN(st_fwr_size, bufsize); + while (i_offset < bufsize) { + if (fwr_size) { + /* TYPE_UB and TYPE_LB can result in + fwr_size = 0. save system call in such cases */ + /* lseek(fd->fd_sys, off, SEEK_SET); + err = write(fd->fd_sys, ((char *) buf) + i_offset, fwr_size);*/ + + req_off = off; + req_len = fwr_size; + userbuf_off = i_offset; + ADIOI_BUFFERED_WRITE + } + i_offset += fwr_size; + + if (off + fwr_size < disp + flat_file->indices[j] + + flat_file->blocklens[j] + n_filetypes*(ADIO_Offset)filetype_extent) + off += fwr_size; + /* did not reach end of contiguous block in filetype. + no more I/O needed. off is incremented by fwr_size. */ + else { + j = (j+1) % flat_file->count; + n_filetypes += (j == 0) ? 1 : 0; + while (flat_file->blocklens[j]==0) { + j = (j+1) % flat_file->count; + n_filetypes += (j == 0) ? 1 : 0; + } + off = disp + flat_file->indices[j] + + n_filetypes*(ADIO_Offset)filetype_extent; + fwr_size = ADIOI_MIN(flat_file->blocklens[j], + bufsize-i_offset); + } + } + } + else { +/* noncontiguous in memory as well as in file */ + + ADIOI_Flatten_datatype(datatype); + flat_buf = ADIOI_Flatlist; + while (flat_buf->type != datatype) flat_buf = flat_buf->next; + + k = num = buf_count = 0; + i_offset = flat_buf->indices[0]; + j = st_index; + off = offset; + n_filetypes = st_n_filetypes; + fwr_size = st_fwr_size; + bwr_size = flat_buf->blocklens[0]; + + while (num < bufsize) { + size = ADIOI_MIN(fwr_size, bwr_size); + if (size) { + /* lseek(fd->fd_sys, off, SEEK_SET); + err = write(fd->fd_sys, ((char *) buf) + i_offset, size); */ + + req_off = off; + req_len = size; + userbuf_off = i_offset; + ADIOI_BUFFERED_WRITE + } + + new_fwr_size = fwr_size; + new_bwr_size = bwr_size; + + if (size == fwr_size) { +/* reached end of contiguous block in file */ + j = (j+1) % flat_file->count; + n_filetypes += (j == 0) ? 1 : 0; + while (flat_file->blocklens[j]==0) { + j = (j+1) % flat_file->count; + n_filetypes += (j == 0) ? 1 : 0; + } + + off = disp + flat_file->indices[j] + + n_filetypes*(ADIO_Offset)filetype_extent; + + new_fwr_size = flat_file->blocklens[j]; + if (size != bwr_size) { + i_offset += size; + new_bwr_size -= size; + } + } + + if (size == bwr_size) { +/* reached end of contiguous block in memory */ + + k = (k + 1)%flat_buf->count; + buf_count++; + i_offset = (ADIO_Offset)buftype_extent*(ADIO_Offset)(buf_count/flat_buf->count) + + flat_buf->indices[k]; + new_bwr_size = flat_buf->blocklens[k]; + if (size != fwr_size) { + off += size; + new_fwr_size -= size; + } + } + num += size; + fwr_size = new_fwr_size; + bwr_size = new_bwr_size; + } + } + + /* write the buffer out finally */ + lseek(fd->fd_sys, writebuf_off, SEEK_SET); + if (!(fd->atomicity)) ADIOI_WRITE_LOCK(fd, writebuf_off, SEEK_SET, writebuf_len); + err = write(fd->fd_sys, writebuf, writebuf_len); + + if (!(fd->atomicity)) + ADIOI_UNLOCK(fd, writebuf_off, SEEK_SET, writebuf_len); + else ADIOI_UNLOCK(fd, start_off, SEEK_SET, end_offset-start_off+1); + + if (err == -1) err_flag = 1; + + ADIOI_Free(writebuf); /* malloced in the buffered_write macro */ + + if (file_ptr_type == ADIO_INDIVIDUAL) fd->fp_ind = off; + if (err_flag) { + *error_code = MPIO_Err_create_code(MPI_SUCCESS, + MPIR_ERR_RECOVERABLE, myname, + __LINE__, MPI_ERR_IO, "**io", + "**io %s", strerror(errno)); + } + else *error_code = MPI_SUCCESS; + } + + fd->fp_sys_posn = -1; /* set it to null. */ + +#ifdef HAVE_STATUS_SET_BYTES + MPIR_Status_set_bytes(status, datatype, bufsize); +/* This is a temporary way of filling in status. The right way is to + keep track of how much data was actually written by ADIOI_BUFFERED_WRITE. */ +#endif + + if (!buftype_is_contig) ADIOI_Delete_flattened(datatype); +} diff --git a/ompi/mca/io/romio/romio/adio/ad_bgl/Makefile.am b/ompi/mca/io/romio/romio/adio/ad_bgl/Makefile.am deleted file mode 100644 index b0ac2f8b32..0000000000 --- a/ompi/mca/io/romio/romio/adio/ad_bgl/Makefile.am +++ /dev/null @@ -1,42 +0,0 @@ -# -# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana -# University Research and Technology -# Corporation. All rights reserved. -# Copyright (c) 2004-2005 The University of Tennessee and The University -# of Tennessee Research Foundation. All rights -# reserved. -# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, -# University of Stuttgart. All rights reserved. -# Copyright (c) 2004-2005 The Regents of the University of California. -# All rights reserved. -# Copyright (c) 2008 Cisco Systems, Inc. All rights reserved. -# $COPYRIGHT$ -# -# Additional copyrights may follow -# -# $HEADER$ -# - -include $(top_srcdir)/Makefile.options - -noinst_LTLIBRARIES = libadio_bgl.la -libadio_bgl_la_SOURCES = \ - ad_bgl_aggrs.c \ - ad_bgl_aggrs.h \ - ad_bgl.c \ - ad_bgl_close.c \ - ad_bgl_fcntl.c \ - ad_bgl_flush.c \ - ad_bgl_getsh.c \ - ad_bgl.h \ - ad_bgl_hints.c \ - ad_bgl_open.c \ - ad_bgl_pset.c \ - ad_bgl_pset.h \ - ad_bgl_rdcoll.c \ - ad_bgl_read.c \ - ad_bgl_setsh.c \ - ad_bgl_tuning.c \ - ad_bgl_tuning.h \ - ad_bgl_wrcoll.c \ - ad_bgl_write.c diff --git a/ompi/mca/io/romio/romio/adio/ad_bgl/Makefile.mk b/ompi/mca/io/romio/romio/adio/ad_bgl/Makefile.mk new file mode 100644 index 0000000000..45ecd715e3 --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_bgl/Makefile.mk @@ -0,0 +1,34 @@ +## -*- Mode: Makefile; -*- +## vim: set ft=automake : +## +## (C) 2011 by Argonne National Laboratory. +## See COPYRIGHT in top-level directory. +## + +if BUILD_AD_BGL + +noinst_HEADERS += \ + adio/ad_bgl/ad_bgl.h \ + adio/ad_bgl/ad_bgl_aggrs.h \ + adio/ad_bgl/ad_bgl_pset.h \ + adio/ad_bgl/ad_bgl_tuning.h + +romio_other_sources += \ + adio/ad_bgl/ad_bgl_open.c \ + adio/ad_bgl/ad_bgl_close.c \ + adio/ad_bgl/ad_bgl_fcntl.c \ + adio/ad_bgl/ad_bgl_flush.c \ + adio/ad_bgl/ad_bgl_read.c \ + adio/ad_bgl/ad_bgl_write.c \ + adio/ad_bgl/ad_bgl_getsh.c \ + adio/ad_bgl/ad_bgl_setsh.c \ + adio/ad_bgl/ad_bgl.c \ + adio/ad_bgl/ad_bgl_aggrs.c \ + adio/ad_bgl/ad_bgl_pset.c \ + adio/ad_bgl/ad_bgl_hints.c \ + adio/ad_bgl/ad_bgl_rdcoll.c \ + adio/ad_bgl/ad_bgl_wrcoll.c \ + adio/ad_bgl/ad_bgl_tuning.c + +endif BUILD_AD_BGL + diff --git a/ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_aggrs.c b/ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_aggrs.c index 39aeb2c05f..375d3c1091 100644 --- a/ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_aggrs.c +++ b/ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_aggrs.c @@ -484,11 +484,17 @@ void ADIOI_BGL_GPFS_Calc_file_domains(ADIO_Offset *st_offsets, * 320k request is a (system-dependent) sweet spot This is from the common code - the new min_fd_size parm that we didn't implement. - (And common code uses a different declaration of fd_size so beware) + (And common code uses a different declaration of fd_size so beware) */ + + /* this is not entirely sufficient on BlueGene: we must be mindful of + * imbalance over psets. the hint processing code has already picked, say, + * 8 processors per pset, so if we go increasing fd_size we'll end up with + * some psets with 8 processors and some psets with none. */ + /* if (fd_size < min_fd_size) fd_size = min_fd_size; - */ + */ fd_size = (ADIO_Offset *) ADIOI_Malloc(nprocs_for_coll * sizeof(ADIO_Offset)); *fd_start_ptr = (ADIO_Offset *) ADIOI_Malloc(nprocs_for_coll * sizeof(ADIO_Offset)); *fd_end_ptr = (ADIO_Offset *) ADIOI_Malloc(nprocs_for_coll * sizeof(ADIO_Offset)); @@ -500,9 +506,16 @@ void ADIOI_BGL_GPFS_Calc_file_domains(ADIO_Offset *st_offsets, ADIO_Offset naggs_large = n_gpfs_blk - naggs * (n_gpfs_blk/naggs); ADIO_Offset naggs_small = naggs - naggs_large; + /* nb_cn_small * blksize: evenly split file domain among processors: + * equivalent to fd_gpfs_rnage/naggs + * (nb_cn_small+1) * blksize: keeps file domain at least 'blksize' big + */ for (i=0; ifs_ptr)->fsync_aggr = ADIOI_BGL_FSYNC_AGGREGATION_ENABLED; @@ -231,11 +231,6 @@ void ADIOI_BGL_Open(ADIO_File fd, int *error_code) if(fd->fd_sys != -1) { - struct stat64 bgl_stat; - struct statfs bgl_statfs; - char* dir; - int rc; - /* Initialize the ad_bgl file system specific information */ AD_BGL_assert(fd->fs_ptr == NULL); fd->fs_ptr = (ADIOI_BGL_fs*) ADIOI_Malloc(sizeof(ADIOI_BGL_fs)); diff --git a/ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_pset.h b/ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_pset.h index f6364fa190..f6a916411f 100644 --- a/ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_pset.h +++ b/ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_pset.h @@ -28,6 +28,8 @@ typedef struct { int cpuid; /* my CPU id -- for virtual node mode (t coord)*/ int rankInPset; /* my relative rank in my PSET */ + int __pad; /* pad to 16 byte alignment */ + } ADIOI_BGL_ProcInfo_t __attribute__((aligned(16))); @@ -47,7 +49,7 @@ typedef struct { #undef MIN -#define MIN(a,b) ((a)<(b) ? (a) : (b)) +#define MIN(a,b) ((afiletype, &filetype_size); if ( ! filetype_size ) { +#ifdef HAVE_STATUS_SET_BYTES + MPIR_Status_set_bytes(status, datatype, 0); +#endif *error_code = MPI_SUCCESS; return; } diff --git a/ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_tuning.c b/ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_tuning.c index 074186efe0..5c1ee6b540 100644 --- a/ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_tuning.c +++ b/ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_tuning.c @@ -22,17 +22,23 @@ #include "ad_bgl_tuning.h" #include "mpi.h" +#if !defined(PVFS2_SUPER_MAGIC) + #define PVFS2_SUPER_MAGIC (0x20030528) +#endif + int bglmpio_timing; int bglmpio_timing2; int bglmpio_comm; int bglmpio_tunegather; int bglmpio_tuneblocking; +long bglocklessmpio_f_type; double bglmpio_prof_cw [BGLMPIO_CIO_LAST]; double bglmpio_prof_cr [BGLMPIO_CIO_LAST]; /* set internal variables for tuning environment variables */ -/** \page env_vars Environment Variables +/** \page mpiio_vars MPIIO Configuration + \section env_sec Environment Variables * - BGLMPIO_COMM - Define how data is exchanged on collective * reads and writes. Possible values: * - 0 - Use MPI_Alltoallv. @@ -65,9 +71,17 @@ double bglmpio_prof_cr [BGLMPIO_CIO_LAST]; * MPI_Alltoallv to exchange domain information. * - Default is 1. * + * - BGLOCKLESSMPIO_F_TYPE - Specify a filesystem type that should run + * the ad_bglockless driver. NOTE: Using romio prefixes (such as + * "bgl:" or "bglockless:") on a file name will override this environment + * variable. Possible values: + * - 0xnnnnnnnn - Any valid file system type (or "magic number") from + * statfs() field f_type. + * - The default is 0x20030528 (PVFS2_SUPER_MAGIC) + * */ void ad_bgl_get_env_vars() { - char *x; + char *x, *dummy; bglmpio_comm = 0; x = getenv( "BGLMPIO_COMM" ); @@ -84,6 +98,11 @@ void ad_bgl_get_env_vars() { bglmpio_tuneblocking = 1; x = getenv( "BGLMPIO_TUNEBLOCKING" ); if (x) bglmpio_tuneblocking = atoi(x); + bglocklessmpio_f_type = PVFS2_SUPER_MAGIC; + x = getenv( "BGLOCKLESSMPIO_F_TYPE" ); + if (x) bglocklessmpio_f_type = strtol(x,&dummy,0); + DBG_FPRINTF(stderr,"BGLOCKLESSMPIO_F_TYPE=%ld/%#lX\n", + bglocklessmpio_f_type,bglocklessmpio_f_type); } /* report timing breakdown for MPI I/O collective call */ diff --git a/ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_tuning.h b/ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_tuning.h index 7513ff3366..ae69d36620 100644 --- a/ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_tuning.h +++ b/ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_tuning.h @@ -59,6 +59,7 @@ extern int bglmpio_timing2; extern int bglmpio_comm; extern int bglmpio_tunegather; extern int bglmpio_tuneblocking; +extern long bglocklessmpio_f_type; /* set internal variables for tuning environment variables */ diff --git a/ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_wrcoll.c b/ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_wrcoll.c index c7e32df6b7..e4985e1345 100644 --- a/ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_wrcoll.c +++ b/ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_wrcoll.c @@ -26,7 +26,7 @@ #endif /* prototypes of functions used for collective writes only. */ -static void ADIOI_Exch_and_write(ADIO_File fd, void *buf, MPI_Datatype +static void ADIOI_Exch_and_write(ADIO_File fd, const void *buf, MPI_Datatype datatype, int nprocs, int myrank, ADIOI_Access *others_req, ADIO_Offset *offset_list, ADIO_Offset *len_list, int contig_access_count, ADIO_Offset @@ -45,10 +45,10 @@ static void ADIOI_W_Exchange_data(ADIO_File fd, void *buf, char *write_buf, ADIO_Offset *fd_start, ADIO_Offset *fd_end, ADIOI_Access *others_req, int *send_buf_idx, int *curr_to_proc, - int *done_to_proc, int *hole, int iter, + int *done_to_proc, int *hole, int iter, MPI_Aint buftype_extent, int *buf_idx, int *error_code); static void ADIOI_W_Exchange_data_alltoallv( - ADIO_File fd, void *buf, + ADIO_File fd, void *buf, char *write_buf, /* 1 */ ADIOI_Flatlist_node *flat_buf, ADIO_Offset *offset_list, @@ -421,7 +421,7 @@ void ADIOI_BGL_WriteStridedColl(ADIO_File fd, void *buf, int count, /* If successful, error_code is set to MPI_SUCCESS. Otherwise an error * code is created and returned in error_code. */ -static void ADIOI_Exch_and_write(ADIO_File fd, void *buf, MPI_Datatype +static void ADIOI_Exch_and_write(ADIO_File fd, const void *buf, MPI_Datatype datatype, int nprocs, int myrank, ADIOI_Access @@ -732,7 +732,7 @@ static void ADIOI_Exch_and_write(ADIO_File fd, void *buf, MPI_Datatype /* Sets error_code to MPI_SUCCESS if successful, or creates an error code * in the case of error. */ -static void ADIOI_W_Exchange_data(ADIO_File fd, void *buf, char *write_buf, +static void ADIOI_W_Exchange_data(ADIO_File fd, const void *buf, char *write_buf, ADIOI_Flatlist_node *flat_buf, ADIO_Offset *offset_list, ADIO_Offset *len_list, int *send_size, int *recv_size, ADIO_Offset off, int size, @@ -799,12 +799,15 @@ static void ADIOI_W_Exchange_data(ADIO_File fd, void *buf, char *write_buf, sum = 0; for (i=0; i srt_len[0]) srt_len[0] = new_len; - } - else - break; - } - if (i < sum || size != srt_len[0]) /* hole in middle or end */ + if (sum) { + if (off != srt_off[0]) /* hole at the front */ *hole = 1; - } + else { /* coalesce the sorted offset-length pairs */ + for (i=1; i srt_len[0]) srt_len[0] = new_len; + } + else + break; + } + if (i < sum || size != srt_len[0]) /* hole in middle or end */ + *hole = 1; + } ADIOI_Free(srt_off); ADIOI_Free(srt_len); + } if (nprocs_recv) { if (*hole) { @@ -1251,7 +1256,7 @@ static void ADIOI_Heap_merge(ADIOI_Access *others_req, int *count, static void ADIOI_W_Exchange_data_alltoallv( - ADIO_File fd, void *buf, + ADIO_File fd, void *buf, char *write_buf, /* 1 */ ADIOI_Flatlist_node *flat_buf, ADIO_Offset *offset_list, diff --git a/ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_write.c b/ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_write.c index 6fcd569fef..3372e7ba88 100644 --- a/ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_write.c +++ b/ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_write.c @@ -253,6 +253,9 @@ void ADIOI_BGL_WriteStrided(ADIO_File fd, void *buf, int count, MPI_Type_size(fd->filetype, &filetype_size); if ( ! filetype_size ) { +#ifdef HAVE_STATUS_SET_BYTES + MPIR_Status_set_bytes(status, datatype, 0); +#endif *error_code = MPI_SUCCESS; return; } diff --git a/ompi/mca/io/romio/romio/adio/ad_bglockless/Makefile.am b/ompi/mca/io/romio/romio/adio/ad_bglockless/Makefile.am deleted file mode 100644 index ec0f951f41..0000000000 --- a/ompi/mca/io/romio/romio/adio/ad_bglockless/Makefile.am +++ /dev/null @@ -1,26 +0,0 @@ -# -# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana -# University Research and Technology -# Corporation. All rights reserved. -# Copyright (c) 2004-2005 The University of Tennessee and The University -# of Tennessee Research Foundation. All rights -# reserved. -# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, -# University of Stuttgart. All rights reserved. -# Copyright (c) 2004-2005 The Regents of the University of California. -# All rights reserved. -# Copyright (c) 2008 Cisco Systems, Inc. All rights reserved. -# $COPYRIGHT$ -# -# Additional copyrights may follow -# -# $HEADER$ -# - -include $(top_srcdir)/Makefile.options - -noinst_LTLIBRARIES = libadio_bglockless.la -libadio_bglockless_la_SOURCES = \ - ad_bglockless.c \ - ad_bglockless.h \ - ad_bglockless_features.c diff --git a/ompi/mca/io/romio/romio/adio/ad_bglockless/Makefile.mk b/ompi/mca/io/romio/romio/adio/ad_bglockless/Makefile.mk new file mode 100644 index 0000000000..8c96bd1c0d --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_bglockless/Makefile.mk @@ -0,0 +1,17 @@ +## -*- Mode: Makefile; -*- +## vim: set ft=automake : +## +## (C) 2011 by Argonne National Laboratory. +## See COPYRIGHT in top-level directory. +## + +if BUILD_AD_BGLOCKLESS + +noinst_HEADERS += adio/ad_bglockless/ad_bglockless.h + +romio_other_sources += \ + adio/ad_bglockless/ad_bglockless.c \ + adio/ad_bglockless/ad_bglockless_features.c + +endif BUILD_AD_BGLOCKLESS + diff --git a/ompi/mca/io/romio/romio/adio/ad_bglockless/ad_bglockless.c b/ompi/mca/io/romio/romio/adio/ad_bglockless/ad_bglockless.c index 759616523c..512f0e9c21 100644 --- a/ompi/mca/io/romio/romio/adio/ad_bglockless/ad_bglockless.c +++ b/ompi/mca/io/romio/romio/adio/ad_bglockless/ad_bglockless.c @@ -1,29 +1,29 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. * See COPYRIGHT notice in top-level directory. */ -#include "../ad_bgl/ad_bgl.h" +#include "../ad_bg/ad_bg.h" #include "ad_bglockless.h" /* adioi.h has the ADIOI_Fns_struct define */ #include "adioi.h" struct ADIOI_Fns_struct ADIO_BGLOCKLESS_operations = { - ADIOI_BGL_Open, /* Open */ + ADIOI_BG_Open, /* Open */ ADIOI_GEN_OpenColl, /* Collective open */ ADIOI_GEN_ReadContig, /* ReadContig */ ADIOI_GEN_WriteContig, /* WriteContig */ - ADIOI_BGL_ReadStridedColl, /* ReadStridedColl */ - ADIOI_BGL_WriteStridedColl, /* WriteStridedColl */ + ADIOI_BG_ReadStridedColl, /* ReadStridedColl */ + ADIOI_BG_WriteStridedColl, /* WriteStridedColl */ ADIOI_GEN_SeekIndividual, /* SeekIndividual */ ADIOI_GEN_Fcntl, /* Fcntl */ - ADIOI_BGL_SetInfo, /* SetInfo */ + ADIOI_BG_SetInfo, /* SetInfo */ ADIOI_GEN_ReadStrided, /* ReadStrided */ ADIOI_NOLOCK_WriteStrided, /* WriteStrided */ - ADIOI_BGL_Close, /* Close */ + ADIOI_BG_Close, /* Close */ #ifdef ROMIO_HAVE_WORKING_AIO ADIOI_GEN_IreadContig, /* IreadContig */ ADIOI_GEN_IwriteContig, /* IwriteContig */ @@ -37,7 +37,7 @@ struct ADIOI_Fns_struct ADIO_BGLOCKLESS_operations = { ADIOI_GEN_IOComplete, /* WriteComplete */ ADIOI_GEN_IreadStrided, /* IreadStrided */ ADIOI_GEN_IwriteStrided, /* IwriteStrided */ - ADIOI_BGL_Flush, /* Flush */ + ADIOI_BG_Flush, /* Flush */ ADIOI_GEN_Resize, /* Resize */ ADIOI_GEN_Delete, /* Delete */ ADIOI_BGLOCKLESS_Feature /* Features */ diff --git a/ompi/mca/io/romio/romio/adio/ad_bglockless/ad_bglockless.h b/ompi/mca/io/romio/romio/adio/ad_bglockless/ad_bglockless.h index 5b6a1fc40f..594dec2ed7 100644 --- a/ompi/mca/io/romio/romio/adio/ad_bglockless/ad_bglockless.h +++ b/ompi/mca/io/romio/romio/adio/ad_bglockless/ad_bglockless.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2008 Uchicago Argonne LLC diff --git a/ompi/mca/io/romio/romio/adio/ad_gridftp/Makefile.am b/ompi/mca/io/romio/romio/adio/ad_gridftp/Makefile.am deleted file mode 100644 index 9e0dd5dff9..0000000000 --- a/ompi/mca/io/romio/romio/adio/ad_gridftp/Makefile.am +++ /dev/null @@ -1,35 +0,0 @@ -# -# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana -# University Research and Technology -# Corporation. All rights reserved. -# Copyright (c) 2004-2005 The University of Tennessee and The University -# of Tennessee Research Foundation. All rights -# reserved. -# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, -# University of Stuttgart. All rights reserved. -# Copyright (c) 2004-2005 The Regents of the University of California. -# All rights reserved. -# $COPYRIGHT$ -# -# Additional copyrights may follow -# -# $HEADER$ -# - -include $(top_srcdir)/Makefile.options - -noinst_LTLIBRARIES = libadio_gridftp.la -libadio_gridftp_la_SOURCES = \ - ad_gridftp.c \ - ad_gridftp.h \ - ad_gridftp_close.c \ - ad_gridftp_delete.c \ - ad_gridftp_fcntl.c \ - ad_gridftp_features.c \ - ad_gridftp_flush.c \ - ad_gridftp_hints.c \ - ad_gridftp_open.c \ - ad_gridftp_read.c \ - ad_gridftp_resize.c \ - ad_gridftp_write.c \ - globus_routines.c diff --git a/ompi/mca/io/romio/romio/adio/ad_gridftp/Makefile.mk b/ompi/mca/io/romio/romio/adio/ad_gridftp/Makefile.mk new file mode 100644 index 0000000000..2cd83a2ad2 --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_gridftp/Makefile.mk @@ -0,0 +1,27 @@ +## -*- Mode: Makefile; -*- +## vim: set ft=automake : +## +## (C) 2011 by Argonne National Laboratory. +## See COPYRIGHT in top-level directory. +## + +if BUILD_AD_GRIDFTP + +noinst_HEADERS += adio/ad_gridftp/ad_gridftp.h + +romio_other_sources += \ + adio/ad_gridftp/ad_gridftp_close.c \ + adio/ad_gridftp/ad_gridftp_open.c \ + adio/ad_gridftp/ad_gridftp_read.c \ + adio/ad_gridftp/ad_gridftp_write.c \ + adio/ad_gridftp/ad_gridftp_fcntl.c \ + adio/ad_gridftp/ad_gridftp_flush.c \ + adio/ad_gridftp/ad_gridftp_resize.c \ + adio/ad_gridftp/ad_gridftp_hints.c \ + adio/ad_gridftp/ad_gridftp_delete.c \ + adio/ad_gridftp/ad_gridftp.c \ + adio/ad_gridftp/globus_routines.c \ + adio/ad_gridftp/ad_gridftp_features.c + +endif BUILD_AD_GRIDFTP + diff --git a/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp.c b/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp.c index fe429c9e4b..f08f112a3c 100644 --- a/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp.c +++ b/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2003 University of Chicago, Ohio Supercomputer Center. diff --git a/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp.h b/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp.h index 857d13365f..0b94c780ea 100644 --- a/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp.h +++ b/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 2003 University of Chicago, Ohio Supercomputer Center. * See COPYRIGHT notice in top-level directory. diff --git a/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_close.c b/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_close.c index deb6044305..c1693d65ce 100644 --- a/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_close.c +++ b/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_close.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2003 University of Chicago, Ohio Supercomputer Center. diff --git a/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_delete.c b/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_delete.c index 9c35116427..54eb714429 100644 --- a/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_delete.c +++ b/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_delete.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2003 University of Chicago, Ohio Supercomputer Center. diff --git a/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_fcntl.c b/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_fcntl.c index 4b9f5a5261..dd9cb5ee09 100644 --- a/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_fcntl.c +++ b/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_fcntl.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2003 University of Chicago, Ohio Supercomputer Center. diff --git a/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_flush.c b/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_flush.c index 408d860aa2..795341e888 100644 --- a/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_flush.c +++ b/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_flush.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2003 University of Chicago, Ohio Supercomputer Center. diff --git a/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_hints.c b/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_hints.c index 124bef6174..c0b0a40ebb 100644 --- a/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_hints.c +++ b/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_hints.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2003 University of Chicago, Ohio Supercomputer Center. diff --git a/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_open.c b/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_open.c index d7b175ed86..45aab92105 100644 --- a/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_open.c +++ b/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_open.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 2003 University of Chicago, Ohio Supercomputer Center. * See COPYRIGHT notice in top-level directory. diff --git a/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_read.c b/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_read.c index a6af99d50e..b7f84b961f 100644 --- a/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_read.c +++ b/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_read.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2003 University of Chicago, Ohio Supercomputer Center. diff --git a/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_resize.c b/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_resize.c index 9ee3e3d4d0..96c0460c42 100644 --- a/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_resize.c +++ b/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_resize.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2003 University of Chicago, Ohio Supercomputer Center. diff --git a/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_write.c b/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_write.c index 869ecef8d6..347c7c5439 100644 --- a/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_write.c +++ b/ompi/mca/io/romio/romio/adio/ad_gridftp/ad_gridftp_write.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2003 University of Chicago, Ohio Supercomputer Center. diff --git a/ompi/mca/io/romio/romio/adio/ad_gridftp/globus_routines.c b/ompi/mca/io/romio/romio/adio/ad_gridftp/globus_routines.c index edb2f56bde..1cca367a3f 100644 --- a/ompi/mca/io/romio/romio/adio/ad_gridftp/globus_routines.c +++ b/ompi/mca/io/romio/romio/adio/ad_gridftp/globus_routines.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2003 University of Chicago, Ohio Supercomputer Center. diff --git a/ompi/mca/io/romio/romio/adio/ad_hfs/Makefile.am b/ompi/mca/io/romio/romio/adio/ad_hfs/Makefile.am deleted file mode 100644 index 78e03f0264..0000000000 --- a/ompi/mca/io/romio/romio/adio/ad_hfs/Makefile.am +++ /dev/null @@ -1,31 +0,0 @@ -# -# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana -# University Research and Technology -# Corporation. All rights reserved. -# Copyright (c) 2004-2005 The University of Tennessee and The University -# of Tennessee Research Foundation. All rights -# reserved. -# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, -# University of Stuttgart. All rights reserved. -# Copyright (c) 2004-2005 The Regents of the University of California. -# All rights reserved. -# $COPYRIGHT$ -# -# Additional copyrights may follow -# -# $HEADER$ -# - -include $(top_srcdir)/Makefile.options - -EXTRA_DIST = README - -noinst_LTLIBRARIES = libadio_hfs.la -libadio_hfs_la_SOURCES = \ - ad_hfs.h \ - ad_hfs.c \ - ad_hfs_fcntl.c \ - ad_hfs_open.c \ - ad_hfs_read.c \ - ad_hfs_resize.c \ - ad_hfs_write.c diff --git a/ompi/mca/io/romio/romio/adio/ad_hfs/Makefile.mk b/ompi/mca/io/romio/romio/adio/ad_hfs/Makefile.mk new file mode 100644 index 0000000000..318b507639 --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_hfs/Makefile.mk @@ -0,0 +1,21 @@ +## -*- Mode: Makefile; -*- +## vim: set ft=automake : +## +## (C) 2011 by Argonne National Laboratory. +## See COPYRIGHT in top-level directory. +## + +if BUILD_AD_HFS + +noinst_HEADERS += adio/ad_hfs/ad_hfs.h + +romio_other_sources += \ + adio/ad_hfs/ad_hfs_read.c \ + adio/ad_hfs/ad_hfs_open.c \ + adio/ad_hfs/ad_hfs_write.c \ + adio/ad_hfs/ad_hfs_fcntl.c \ + adio/ad_hfs/ad_hfs_resize.c \ + adio/ad_hfs/ad_hfs.c + +endif BUILD_AD_HFS + diff --git a/ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs.c b/ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs.c index 95816882d8..ad99ff7b81 100644 --- a/ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs.c +++ b/ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs.h b/ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs.h index f5142d17ee..2950aa50fc 100644 --- a/ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs.h +++ b/ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs_fcntl.c b/ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs_fcntl.c index b17227fd41..460c73666f 100644 --- a/ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs_fcntl.c +++ b/ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs_fcntl.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -30,7 +30,7 @@ void ADIOI_HFS_Fcntl(ADIO_File fd, int flag, ADIO_Fcntl_t *fcntl_struct, int *er /* not required in SPPUX since there we use pread/pwrite */ #endif if (fcntl_struct->fsize == -1) { -#ifdef MPICH2 +#ifdef MPICH *error_code = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_IO, "**io", "**io %s", strerror(errno)); #elif defined(PRINT_ERR_MSG) @@ -51,7 +51,7 @@ void ADIOI_HFS_Fcntl(ADIO_File fd, int flag, ADIO_Fcntl_t *fcntl_struct, int *er err = prealloc64(fd->fd_sys, fcntl_struct->diskspace); /* prealloc64 works only if file is of zero length */ if (err && (errno != ENOTEMPTY)) { -#ifdef MPICH2 +#ifdef MPICH *error_code = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_IO, "**io", "**io %s", strerror(errno)); #elif defined(PRINT_ERR_MSG) @@ -72,7 +72,7 @@ void ADIOI_HFS_Fcntl(ADIO_File fd, int flag, ADIO_Fcntl_t *fcntl_struct, int *er if (fcntl_struct->diskspace <= 2147483647) { err = prealloc(fd->fd_sys, (off_t) fcntl_struct->diskspace); if (err && (errno != ENOTEMPTY)) { -#ifdef MPICH2 +#ifdef MPICH *error_code = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_IO, "**io", "**io %s", strerror(errno)); #elif defined(PRINT_ERR_MSG) diff --git a/ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs_open.c b/ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs_open.c index 8e56a4571e..46ee2848e5 100644 --- a/ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs_open.c +++ b/ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs_open.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -52,7 +52,7 @@ void ADIOI_HFS_Open(ADIO_File fd, int *error_code) #endif if (fd->fd_sys == -1 ) { -#ifdef MPICH2 +#ifdef MPICH *error_code = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_IO, "**io", "**io %s", strerror(errno)); #elif defined(PRINT_ERR_MSG) diff --git a/ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs_read.c b/ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs_read.c index 06e7fec896..ecd6fdfd80 100644 --- a/ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs_read.c +++ b/ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs_read.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -56,7 +56,7 @@ void ADIOI_HFS_ReadContig(ADIO_File fd, void *buf, int count, #endif if (err == -1 ) { -#ifdef MPICH2 +#ifdef MPICH *error_code = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_IO, "**io", "**io %s", strerror(errno)); #elif defined(PRINT_ERR_MSG) diff --git a/ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs_resize.c b/ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs_resize.c index 65e8f93de9..de24ad672a 100644 --- a/ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs_resize.c +++ b/ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs_resize.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -16,7 +16,7 @@ void ADIOI_HFS_Resize(ADIO_File fd, ADIO_Offset size, int *error_code) err = ftruncate64(fd->fd_sys, size); if (err == -1) { -#ifdef MPICH2 +#ifdef MPICH *error_code = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_IO, "**io", "**io %s", strerror(errno)); #elif defined(PRINT_ERR_MSG) diff --git a/ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs_write.c b/ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs_write.c index ab42d31bb6..e4c476ced1 100644 --- a/ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs_write.c +++ b/ompi/mca/io/romio/romio/adio/ad_hfs/ad_hfs_write.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -55,7 +55,7 @@ void ADIOI_HFS_WriteContig(ADIO_File fd, void *buf, int count, #endif if (err == -1) { -#ifdef MPICH2 +#ifdef MPICH *error_code = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_IO, "**io", "**io %s", strerror(errno)); #elif defined(PRINT_ERR_MSG) diff --git a/ompi/mca/io/romio/romio/adio/ad_lustre/Makefile.am b/ompi/mca/io/romio/romio/adio/ad_lustre/Makefile.am deleted file mode 100644 index 6e20ce8919..0000000000 --- a/ompi/mca/io/romio/romio/adio/ad_lustre/Makefile.am +++ /dev/null @@ -1,34 +0,0 @@ -# -# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana -# University Research and Technology -# Corporation. All rights reserved. -# Copyright (c) 2004-2005 The University of Tennessee and The University -# of Tennessee Research Foundation. All rights -# reserved. -# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, -# University of Stuttgart. All rights reserved. -# Copyright (c) 2004-2005 The Regents of the University of California. -# All rights reserved. -# Copyright (c) 2008 Cisco Systems, Inc. All rights reserved. -# $COPYRIGHT$ -# -# Additional copyrights may follow -# -# $HEADER$ -# - -include $(top_srcdir)/Makefile.options - -EXTRA_DIST = README - -noinst_LTLIBRARIES = libadio_lustre.la -libadio_lustre_la_SOURCES = \ - ad_lustre.c \ - ad_lustre_aggregate.c \ - ad_lustre_fcntl.c \ - ad_lustre.h \ - ad_lustre_hints.c \ - ad_lustre_open.c \ - ad_lustre_wrcoll.c \ - ad_lustre_rwcontig.c \ - ad_lustre_wrstr.c diff --git a/ompi/mca/io/romio/romio/adio/ad_lustre/Makefile.mk b/ompi/mca/io/romio/romio/adio/ad_lustre/Makefile.mk new file mode 100644 index 0000000000..43eaa025b9 --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_lustre/Makefile.mk @@ -0,0 +1,22 @@ +## -*- Mode: Makefile; -*- +## vim: set ft=automake : +## +## (C) 2011 by Argonne National Laboratory. +## See COPYRIGHT in top-level directory. +## + +if BUILD_AD_LUSTRE + +noinst_HEADERS += adio/ad_lustre/ad_lustre.h + +romio_other_sources += \ + adio/ad_lustre/ad_lustre.c \ + adio/ad_lustre/ad_lustre_open.c \ + adio/ad_lustre/ad_lustre_rwcontig.c \ + adio/ad_lustre/ad_lustre_wrcoll.c \ + adio/ad_lustre/ad_lustre_wrstr.c \ + adio/ad_lustre/ad_lustre_hints.c \ + adio/ad_lustre/ad_lustre_aggregate.c + +endif BUILD_AD_LUSTRE + diff --git a/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre.c b/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre.c index 08809e5c65..f5a81b45b5 100644 --- a/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre.c +++ b/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 2001 University of Chicago. * See COPYRIGHT notice in top-level directory. diff --git a/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre.h b/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre.h index 3252907596..ae572cc792 100644 --- a/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre.h +++ b/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. diff --git a/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_aggregate.c b/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_aggregate.c index 203b080edb..a43f56596d 100644 --- a/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_aggregate.c +++ b/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_aggregate.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. diff --git a/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_fcntl.c b/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_fcntl.c index 3afd16a011..a4bd6fc6d1 100644 --- a/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_fcntl.c +++ b/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_fcntl.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. @@ -15,7 +15,7 @@ void ADIOI_LUSTRE_Fcntl(ADIO_File fd, int flag, ADIO_Fcntl_t *fcntl_struct, int ADIO_Offset curr_fsize, alloc_size, size, len, done; ADIO_Status status; char *buf; -#if defined(MPICH2) || !defined(PRINT_ERR_MSG) +#if defined(MPICH) || !defined(PRINT_ERR_MSG) static char myname[] = "ADIOI_LUSTRE_FCNTL"; #endif diff --git a/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_hints.c b/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_hints.c index d925779ef3..ea2c4ba3eb 100644 --- a/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_hints.c +++ b/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_hints.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. diff --git a/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_open.c b/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_open.c index 1ee9870fcf..0c664ac2cd 100644 --- a/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_open.c +++ b/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_open.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. @@ -22,7 +22,7 @@ void ADIOI_LUSTRE_Open(ADIO_File fd, int *error_code) struct lov_user_md *lum = NULL; char *value; -#if defined(MPICH2) || !defined(PRINT_ERR_MSG) +#if defined(MPICH) || !defined(PRINT_ERR_MSG) static char myname[] = "ADIOI_LUSTRE_OPEN"; #endif diff --git a/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_rwcontig.c b/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_rwcontig.c index dd8f5ec8a6..0b7bc248c6 100644 --- a/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_rwcontig.c +++ b/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_rwcontig.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. diff --git a/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_wrcoll.c b/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_wrcoll.c index 231465b481..f67959f51e 100644 --- a/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_wrcoll.c +++ b/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_wrcoll.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. @@ -42,7 +42,7 @@ static void ADIOI_LUSTRE_W_Exchange_data(ADIO_File fd, void *buf, ADIO_Offset *len_list, int *send_size, int *recv_size, ADIO_Offset off, int size, int *count, - int *start_pos, int *partial_recv, + int *start_pos, int *sent_to_proc, int nprocs, int myrank, int buftype_is_contig, int contig_access_count, @@ -52,7 +52,9 @@ static void ADIOI_LUSTRE_W_Exchange_data(ADIO_File fd, void *buf, int *curr_to_proc, int *done_to_proc, int *hole, int iter, MPI_Aint buftype_extent, - int *buf_idx, int *error_code); + int *buf_idx, + ADIO_Offset **srt_off, int **srt_len, int *srt_num, + int *error_code); void ADIOI_Heap_merge(ADIOI_Access *others_req, int *count, ADIO_Offset *srt_off, int *srt_len, int *start_pos, int nprocs, int nprocs_recv, int total_elements); @@ -308,7 +310,7 @@ static void ADIOI_LUSTRE_Exch_and_write(ADIO_File fd, void *buf, int real_size, req_len, send_len; int *recv_curr_offlen_ptr, *recv_count, *recv_size; int *send_curr_offlen_ptr, *send_size; - int *partial_recv, *sent_to_proc, *recv_start_pos; + int *sent_to_proc, *recv_start_pos; int *send_buf_idx, *curr_to_proc, *done_to_proc; int *this_buf_idx; char *write_buf = NULL; @@ -317,6 +319,11 @@ static void ADIOI_LUSTRE_Exch_and_write(ADIO_File fd, void *buf, MPI_Aint buftype_extent; int stripe_size = striping_info[0], avail_cb_nodes = striping_info[2]; int data_sieving = 0; + ADIO_Offset *srt_off = NULL; + int *srt_len = NULL; + int srt_num = 0; + ADIO_Offset block_offset; + int block_len; *error_code = MPI_SUCCESS; /* changed below if error */ /* only I/O errors are currently reported */ @@ -508,12 +515,14 @@ static void ADIOI_LUSTRE_Exch_and_write(ADIO_File fd, void *buf, hole = data_sieving; ADIOI_LUSTRE_W_Exchange_data(fd, buf, write_buf, flat_buf, offset_list, len_list, send_size, recv_size, off, real_size, - recv_count, recv_start_pos, partial_recv, + recv_count, recv_start_pos, sent_to_proc, nprocs, myrank, buftype_is_contig, contig_access_count, striping_info, others_req, send_buf_idx, curr_to_proc, done_to_proc, &hole, m, - buftype_extent, this_buf_idx, error_code); + buftype_extent, this_buf_idx, + &srt_off, &srt_len, &srt_num, error_code); + if (*error_code != MPI_SUCCESS) goto over; @@ -537,23 +546,42 @@ static void ADIOI_LUSTRE_Exch_and_write(ADIO_File fd, void *buf, ADIO_EXPLICIT_OFFSET, off, &status, error_code); } else { - for (i = 0; i < nprocs; i++) { - if (others_req[i].count) { - for (j = 0; j < others_req[i].count; j++) { - if (others_req[i].offsets[j] < off + real_size && - others_req[i].offsets[j] >= off) { + block_offset = -1; + block_len = 0; + for (i = 0; i < srt_num; ++i) { + if (srt_off[i] < off + real_size && + srt_off[i] >= off) { + if (block_offset == -1) { + block_offset = srt_off[i]; + block_len = srt_len[i]; + } else { + if (srt_off[i] == block_offset + block_len) { + block_len += srt_len[i]; + } else { ADIO_WriteContig(fd, - write_buf + others_req[i].offsets[j] - off, - others_req[i].lens[j], + write_buf + block_offset - off, + block_len, MPI_BYTE, ADIO_EXPLICIT_OFFSET, - others_req[i].offsets[j], &status, + block_offset, &status, error_code); if (*error_code != MPI_SUCCESS) goto over; + block_offset = srt_off[i]; + block_len = srt_len[i]; } } } } + if (block_offset != -1) { + ADIO_WriteContig(fd, + write_buf + block_offset - off, + block_len, + MPI_BYTE, ADIO_EXPLICIT_OFFSET, + block_offset, &status, + error_code); + if (*error_code != MPI_SUCCESS) + goto over; + } } } if (*error_code != MPI_SUCCESS) @@ -562,6 +590,10 @@ static void ADIOI_LUSTRE_Exch_and_write(ADIO_File fd, void *buf, iter_st_off += max_size; } over: + if (srt_off) + ADIOI_Free(srt_off); + if (srt_len) + ADIOI_Free(srt_len); if (ntimes) ADIOI_Free(write_buf); ADIOI_Free(recv_curr_offlen_ptr); @@ -588,7 +620,7 @@ static void ADIOI_LUSTRE_W_Exchange_data(ADIO_File fd, void *buf, ADIO_Offset *len_list, int *send_size, int *recv_size, ADIO_Offset off, int size, int *count, - int *start_pos, int *partial_recv, + int *start_pos, int *sent_to_proc, int nprocs, int myrank, int buftype_is_contig, int contig_access_count, @@ -598,15 +630,16 @@ static void ADIOI_LUSTRE_W_Exchange_data(ADIO_File fd, void *buf, int *curr_to_proc, int *done_to_proc, int *hole, int iter, MPI_Aint buftype_extent, - int *buf_idx, int *error_code) + int *buf_idx, + ADIO_Offset **srt_off, int **srt_len, int *srt_num, + int *error_code) { int i, j, nprocs_recv, nprocs_send, err; char **send_buf = NULL; MPI_Request *requests, *send_req; MPI_Datatype *recv_types; MPI_Status *statuses, status; - int *srt_len, sum, sum_recv; - ADIO_Offset *srt_off; + int sum_recv; int data_sieving = *hole; static char myname[] = "ADIOI_W_EXCHANGE_DATA"; @@ -638,20 +671,26 @@ static void ADIOI_LUSTRE_W_Exchange_data(ADIO_File fd, void *buf, * For this, merge the (sorted) offset lists others_req using a heap-merge. */ - sum = 0; + *srt_num = 0; for (i = 0; i < nprocs; i++) - sum += count[i]; - srt_off = (ADIO_Offset *) ADIOI_Malloc((sum + 1) * sizeof(ADIO_Offset)); - srt_len = (int *) ADIOI_Malloc((sum + 1) * sizeof(int)); + *srt_num += count[i]; + if (*srt_off) + *srt_off = (ADIO_Offset *) ADIOI_Realloc(*srt_off, (*srt_num + 1) * sizeof(ADIO_Offset)); + else + *srt_off = (ADIO_Offset *) ADIOI_Malloc((*srt_num + 1) * sizeof(ADIO_Offset)); + if (*srt_len) + *srt_len = (int *) ADIOI_Realloc(*srt_len, (*srt_num + 1) * sizeof(int)); + else + *srt_len = (int *) ADIOI_Malloc((*srt_num + 1) * sizeof(int)); /* +1 to avoid a 0-size malloc */ - ADIOI_Heap_merge(others_req, count, srt_off, srt_len, start_pos, - nprocs, nprocs_recv, sum); + ADIOI_Heap_merge(others_req, count, *srt_off, *srt_len, start_pos, + nprocs, nprocs_recv, *srt_num); /* check if there are any holes */ *hole = 0; - for (i = 0; i < sum - 1; i++) { - if (srt_off[i] + srt_len[i] < srt_off[i + 1]) { + for (i = 0; i < *srt_num - 1; i++) { + if ((*srt_off)[i] + (*srt_len)[i] < (*srt_off)[i + 1]) { *hole = 1; break; } @@ -681,14 +720,10 @@ static void ADIOI_LUSTRE_W_Exchange_data(ADIO_File fd, void *buf, MPI_ERR_IO, "**ioRMWrdwr", 0); ADIOI_Free(recv_types); - ADIOI_Free(srt_off); - ADIOI_Free(srt_len); return; } // --END ERROR HANDLING-- } - ADIOI_Free(srt_off); - ADIOI_Free(srt_len); nprocs_send = 0; for (i = 0; i < nprocs; i++) diff --git a/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_wrstr.c b/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_wrstr.c index 2854a37c7e..684b388eac 100644 --- a/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_wrstr.c +++ b/ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_wrstr.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. @@ -188,6 +188,9 @@ void ADIOI_LUSTRE_WriteStrided(ADIO_File fd, void *buf, int count, MPI_Type_size(fd->filetype, &filetype_size); if (!filetype_size) { +#ifdef HAVE_STATUS_SET_BYTES + MPIR_Status_set_bytes(status, datatype, 0); +#endif *error_code = MPI_SUCCESS; return; } diff --git a/ompi/mca/io/romio/romio/adio/ad_nfs/Makefile.am b/ompi/mca/io/romio/romio/adio/ad_nfs/Makefile.am deleted file mode 100644 index 0caa867c3f..0000000000 --- a/ompi/mca/io/romio/romio/adio/ad_nfs/Makefile.am +++ /dev/null @@ -1,37 +0,0 @@ -# -# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana -# University Research and Technology -# Corporation. All rights reserved. -# Copyright (c) 2004-2005 The University of Tennessee and The University -# of Tennessee Research Foundation. All rights -# reserved. -# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, -# University of Stuttgart. All rights reserved. -# Copyright (c) 2004-2005 The Regents of the University of California. -# All rights reserved. -# $COPYRIGHT$ -# -# Additional copyrights may follow -# -# $HEADER$ -# - -include $(top_srcdir)/Makefile.options - -noinst_LTLIBRARIES = libadio_nfs.la -libadio_nfs_la_SOURCES = \ - ad_nfs.c \ - ad_nfs.h \ - ad_nfs_done.c \ - ad_nfs_fcntl.c \ - ad_nfs_features.c \ - ad_nfs_getsh.c \ - ad_nfs_hints.c \ - ad_nfs_iread.c \ - ad_nfs_iwrite.c \ - ad_nfs_open.c \ - ad_nfs_read.c \ - ad_nfs_resize.c \ - ad_nfs_setsh.c \ - ad_nfs_wait.c \ - ad_nfs_write.c diff --git a/ompi/mca/io/romio/romio/adio/ad_nfs/Makefile.mk b/ompi/mca/io/romio/romio/adio/ad_nfs/Makefile.mk new file mode 100644 index 0000000000..ca25e20cbe --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_nfs/Makefile.mk @@ -0,0 +1,28 @@ +## -*- Mode: Makefile; -*- +## vim: set ft=automake : +## +## (C) 2011 by Argonne National Laboratory. +## See COPYRIGHT in top-level directory. +## + +if BUILD_AD_NFS + +noinst_HEADERS += adio/ad_nfs/ad_nfs.h + +romio_other_sources += \ + adio/ad_nfs/ad_nfs_read.c \ + adio/ad_nfs/ad_nfs_open.c \ + adio/ad_nfs/ad_nfs_write.c \ + adio/ad_nfs/ad_nfs_done.c \ + adio/ad_nfs/ad_nfs_fcntl.c \ + adio/ad_nfs/ad_nfs_iread.c \ + adio/ad_nfs/ad_nfs_iwrite.c \ + adio/ad_nfs/ad_nfs_wait.c \ + adio/ad_nfs/ad_nfs_setsh.c \ + adio/ad_nfs/ad_nfs_getsh.c \ + adio/ad_nfs/ad_nfs.c \ + adio/ad_nfs/ad_nfs_resize.c \ + adio/ad_nfs/ad_nfs_features.c + +endif BUILD_AD_NFS + diff --git a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs.c b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs.c index c3f8b4ce4f..8f323b88dc 100644 --- a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs.c +++ b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs.h b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs.h index 5a1daa5f64..b1037793a7 100644 --- a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs.h +++ b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. @@ -43,7 +43,7 @@ void ADIOI_NFS_ReadContig(ADIO_File fd, void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code); -void ADIOI_NFS_WriteContig(ADIO_File fd, void *buf, int count, +void ADIOI_NFS_WriteContig(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code); @@ -65,7 +65,7 @@ void ADIOI_NFS_WriteComplete(ADIO_Request *request, ADIO_Status *status, int *error_code); void ADIOI_NFS_Fcntl(ADIO_File fd, int flag, ADIO_Fcntl_t *fcntl_struct, int *error_code); -void ADIOI_NFS_WriteStrided(ADIO_File fd, void *buf, int count, +void ADIOI_NFS_WriteStrided(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code); diff --git a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_done.c b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_done.c index 79baf2ec86..ff688546ca 100644 --- a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_done.c +++ b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_done.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. diff --git a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_fcntl.c b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_fcntl.c index 992c09bfb6..c73006e6cd 100644 --- a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_fcntl.c +++ b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_fcntl.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_features.c b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_features.c index 01768f71f3..14918063af 100644 --- a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_features.c +++ b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_features.c @@ -10,6 +10,7 @@ int ADIOI_NFS_Feature(ADIO_File fd, int flag) case ADIO_DATA_SIEVING_WRITES: return 1; case ADIO_SCALABLE_OPEN: + case ADIO_UNLINK_AFTER_CLOSE: default: return 0; } diff --git a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_getsh.c b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_getsh.c index 60b62546c2..3f73a999a8 100644 --- a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_getsh.c +++ b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_getsh.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -73,6 +73,8 @@ void ADIOI_NFS_Get_shared_fp(ADIO_File fd, int incr, ADIO_Offset *shared_fp, } } + if (incr == 0) {goto done;} + new_fp = *shared_fp + incr; #ifdef ADIOI_MPE_LOGGING @@ -91,6 +93,7 @@ void ADIOI_NFS_Get_shared_fp(ADIO_File fd, int incr, ADIO_Offset *shared_fp, MPE_Log_event( ADIOI_MPE_write_b, 0, NULL ); #endif } +done: ADIOI_UNLOCK(fd->shared_fp_fd, 0, SEEK_SET, sizeof(ADIO_Offset)); if (err == -1) { *error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, diff --git a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_hints.c b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_hints.c index 891a3701ac..0e5386d22b 100644 --- a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_hints.c +++ b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_hints.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_iread.c b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_iread.c index 4896354a33..21b604094c 100644 --- a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_iread.c +++ b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_iread.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. diff --git a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_iwrite.c b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_iwrite.c index 0cfd562170..6a92f83678 100644 --- a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_iwrite.c +++ b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_iwrite.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. diff --git a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_open.c b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_open.c index 399dc27663..f8dac56331 100644 --- a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_open.c +++ b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_open.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -91,6 +91,19 @@ void ADIOI_NFS_Open(ADIO_File fd, int *error_code) __LINE__, MPI_ERR_READ_ONLY, "**ioneedrd", 0); } + else if(errno == EISDIR) { + *error_code = MPIO_Err_create_code(MPI_SUCCESS, + MPIR_ERR_RECOVERABLE, myname, + __LINE__, MPI_ERR_BAD_FILE, + "**filename", 0); + } + else if(errno == EEXIST) { + *error_code = MPIO_Err_create_code(MPI_SUCCESS, + MPIR_ERR_RECOVERABLE, myname, + __LINE__, MPI_ERR_FILE_EXISTS, + "**fileexist", 0); + + } else { *error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, diff --git a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_read.c b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_read.c index b28a57bb55..16f3a4d12c 100644 --- a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_read.c +++ b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_read.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -187,6 +187,9 @@ void ADIOI_NFS_ReadStrided(ADIO_File fd, void *buf, int count, MPI_Type_size(fd->filetype, &filetype_size); if ( ! filetype_size ) { +#ifdef HAVE_STATUS_SET_BYTES + MPIR_Status_set_bytes(status, datatype, 0); +#endif *error_code = MPI_SUCCESS; return; } diff --git a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_resize.c b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_resize.c index 99ede411b4..d86dfcc77e 100644 --- a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_resize.c +++ b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_resize.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2004 University of Chicago. @@ -20,15 +20,13 @@ void ADIOI_NFS_Resize(ADIO_File fd, ADIO_Offset size, int *error_code) { int err; - static char myname[] = "ADIOI_GEN_RESIZE"; + static char myname[] = "ADIOI_NFS_RESIZE"; err = ftruncate(fd->fd_sys, size); /* --BEGIN ERROR HANDLING-- */ if (err == -1) { - *error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, - myname, __LINE__, MPI_ERR_IO, - "**io", "**io %s", strerror(errno)); + *error_code = ADIOI_Err_create_code(myname, fd->filename, errno); return; } /* --END ERROR HANDLING-- */ diff --git a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_setsh.c b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_setsh.c index a0beff77da..34c92bacf9 100644 --- a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_setsh.c +++ b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_setsh.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_wait.c b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_wait.c index 0148f63973..e1037fc551 100644 --- a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_wait.c +++ b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_wait.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. diff --git a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_write.c b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_write.c index 7c82e314e1..6b607a1e25 100644 --- a/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_write.c +++ b/ompi/mca/io/romio/romio/adio/ad_nfs/ad_nfs_write.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -8,7 +8,7 @@ #include "ad_nfs.h" #include "adio_extern.h" -void ADIOI_NFS_WriteContig(ADIO_File fd, void *buf, int count, +void ADIOI_NFS_WriteContig(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code) { @@ -263,7 +263,7 @@ void ADIOI_NFS_WriteContig(ADIO_File fd, void *buf, int count, #endif -void ADIOI_NFS_WriteStrided(ADIO_File fd, void *buf, int count, +void ADIOI_NFS_WriteStrided(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code) @@ -290,6 +290,9 @@ void ADIOI_NFS_WriteStrided(ADIO_File fd, void *buf, int count, MPI_Type_size(fd->filetype, &filetype_size); if ( ! filetype_size ) { +#ifdef HAVE_STATUS_SET_BYTES + MPIR_Status_set_bytes(status, datatype, 0); +#endif *error_code = MPI_SUCCESS; return; } diff --git a/ompi/mca/io/romio/romio/adio/ad_ntfs/Makefile.am b/ompi/mca/io/romio/romio/adio/ad_ntfs/Makefile.am deleted file mode 100644 index cbef3bc373..0000000000 --- a/ompi/mca/io/romio/romio/adio/ad_ntfs/Makefile.am +++ /dev/null @@ -1,35 +0,0 @@ -# -# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana -# University Research and Technology -# Corporation. All rights reserved. -# Copyright (c) 2004-2005 The University of Tennessee and The University -# of Tennessee Research Foundation. All rights -# reserved. -# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, -# University of Stuttgart. All rights reserved. -# Copyright (c) 2004-2005 The Regents of the University of California. -# All rights reserved. -# $COPYRIGHT$ -# -# Additional copyrights may follow -# -# $HEADER$ -# - -include $(top_srcdir)/Makefile.options - -noinst_LTLIBRARIES = libadio_ntfs.la -libadio_ntfs_la_SOURCES = \ - ad_ntfs.c \ - ad_ntfs.h \ - ad_ntfs_close.c \ - ad_ntfs_done.c \ - ad_ntfs_fcntl.c \ - ad_ntfs_flush.c \ - ad_ntfs_iread.c \ - ad_ntfs_iwrite.c \ - ad_ntfs_open.c \ - ad_ntfs_read.c \ - ad_ntfs_resize.c \ - ad_ntfs_wait.c \ - ad_ntfs_write.c diff --git a/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs.c b/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs.c index c49f2e86eb..ff951107b5 100644 --- a/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs.c +++ b/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. @@ -34,5 +34,5 @@ struct ADIOI_Fns_struct ADIO_NTFS_operations = { ADIOI_NTFS_Flush, /* Flush */ ADIOI_NTFS_Resize, /* Resize */ ADIOI_GEN_Delete, /* Delete */ - ADIOI_GEN_Feature /* Features */ + ADIOI_NTFS_Feature /* Features */ }; diff --git a/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs.h b/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs.h index 836d1401ed..aed6168bd8 100644 --- a/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs.h +++ b/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * diff --git a/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_close.c b/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_close.c index 37994b852b..95022dca77 100644 --- a/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_close.c +++ b/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_close.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_done.c b/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_done.c index ab2bbb7c21..9f4967b48b 100644 --- a/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_done.c +++ b/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_done.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. diff --git a/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_fcntl.c b/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_fcntl.c index 5841475bd0..4c7d66cd07 100644 --- a/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_fcntl.c +++ b/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_fcntl.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. diff --git a/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_feature.c b/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_feature.c new file mode 100644 index 0000000000..691c224e91 --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_feature.c @@ -0,0 +1,20 @@ +#include "adio.h" + +int ADIOI_NTFS_Feature(ADIO_File fd, int flag) +{ + switch(flag) { + /* supported features */ + case ADIO_LOCKS: + case ADIO_SHARED_FP: + case ADIO_ATOMIC_MODE: + case ADIO_DATA_SIEVING_WRITES: + return 1; + break; + /* unsupported features */ + case ADIO_SCALABLE_OPEN: + case ADIO_UNLINK_AFTER_CLOSE: + default: + return 0; + break; + } +} diff --git a/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_flush.c b/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_flush.c index ecabf1d5a9..7656d60fb6 100644 --- a/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_flush.c +++ b/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_flush.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_iread.c b/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_iread.c index 174f6447cb..c186cfde1b 100644 --- a/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_iread.c +++ b/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_iread.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. diff --git a/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_iwrite.c b/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_iwrite.c index b43e1a9a75..5956796f59 100644 --- a/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_iwrite.c +++ b/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_iwrite.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. diff --git a/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_open.c b/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_open.c index 1f1db067f4..3a49418dba 100644 --- a/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_open.c +++ b/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_open.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * diff --git a/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_read.c b/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_read.c index 3a22cad781..addc5301e0 100644 --- a/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_read.c +++ b/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_read.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. diff --git a/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_resize.c b/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_resize.c index 68efa00e9a..0fbeaaf972 100644 --- a/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_resize.c +++ b/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_resize.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_wait.c b/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_wait.c index 20a95cc656..80dfa4d334 100644 --- a/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_wait.c +++ b/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_wait.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. diff --git a/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_write.c b/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_write.c index f971e8a525..9bb62abfbf 100644 --- a/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_write.c +++ b/ompi/mca/io/romio/romio/adio/ad_ntfs/ad_ntfs_write.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. diff --git a/ompi/mca/io/romio/romio/adio/ad_panfs/Makefile.am b/ompi/mca/io/romio/romio/adio/ad_panfs/Makefile.am deleted file mode 100644 index 1573fa22e4..0000000000 --- a/ompi/mca/io/romio/romio/adio/ad_panfs/Makefile.am +++ /dev/null @@ -1,30 +0,0 @@ -# -# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana -# University Research and Technology -# Corporation. All rights reserved. -# Copyright (c) 2004-2005 The University of Tennessee and The University -# of Tennessee Research Foundation. All rights -# reserved. -# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, -# University of Stuttgart. All rights reserved. -# Copyright (c) 2004-2005 The Regents of the University of California. -# All rights reserved. -# Copyright (c) 2008 Cisco Systems, Inc. All rights reserved. -# $COPYRIGHT$ -# -# Additional copyrights may follow -# -# $HEADER$ -# - -include $(top_srcdir)/Makefile.options - -noinst_LTLIBRARIES = libadio_panfs.la -libadio_panfs_la_SOURCES = \ - ad_panfs.c \ - ad_panfs.h \ - ad_panfs_hints.c \ - ad_panfs_open.c \ - ad_panfs_read.c \ - ad_panfs_resize.c \ - ad_panfs_write.c diff --git a/ompi/mca/io/romio/romio/adio/ad_panfs/Makefile.mk b/ompi/mca/io/romio/romio/adio/ad_panfs/Makefile.mk new file mode 100644 index 0000000000..b7a1c782da --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_panfs/Makefile.mk @@ -0,0 +1,25 @@ +## -*- Mode: Makefile; -*- +## vim: set ft=automake : +## +## (C) 2011 by Argonne National Laboratory. +## See COPYRIGHT in top-level directory. +## + +if BUILD_AD_PANFS + +# I don't like this hard-coded path to the PANFS headers but I guess that's +# where they always are? +AM_CPPFLAGS += -I/opt/panfs/include + +noinst_HEADERS += adio/ad_panfs/ad_panfs.h + +romio_other_sources += \ + adio/ad_panfs/ad_panfs.c \ + adio/ad_panfs/ad_panfs_open.c \ + adio/ad_panfs/ad_panfs_hints.c \ + adio/ad_panfs/ad_panfs_read.c \ + adio/ad_panfs/ad_panfs_resize.c \ + adio/ad_panfs/ad_panfs_write.c + +endif BUILD_AD_PANFS + diff --git a/ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs.c b/ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs.c index f2e96bbba8..b3ce0fb96d 100644 --- a/ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs.c +++ b/ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * ad_panfs.c * diff --git a/ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs.h b/ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs.h index 97f61ddb3d..6164e8e744 100644 --- a/ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs.h +++ b/ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * ad_panfs.h * diff --git a/ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs_hints.c b/ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs_hints.c index 4755a0aa74..4931eb8f33 100644 --- a/ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs_hints.c +++ b/ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs_hints.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * ad_panfs_hints.c * @@ -11,7 +11,9 @@ void ADIOI_PANFS_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code) { +#if defined(MPICH) || !defined(PRINT_ERR_MSG) static char myname[] = "ADIOI_PANFS_SETINFO"; +#endif char* value; int flag, tmp_val = -1; unsigned long int concurrent_write = 0; diff --git a/ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs_open.c b/ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs_open.c index d7cdf19454..807337ef62 100644 --- a/ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs_open.c +++ b/ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs_open.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * ad_panfs_open.c * @@ -156,7 +156,7 @@ void ADIOI_PANFS_Open(ADIO_File fd, int *error_code) char* slash; struct stat stat_buf; int err; - char *value, *path, *file_name_ptr; + char *path; /* Check that the file does not exist before * trying to create it. The ioctl itself should @@ -327,6 +327,8 @@ void ADIOI_PANFS_Open(ADIO_File fd, int *error_code) ADIOI_Snprintf(temp_buffer,TEMP_BUFFER_SIZE,"%u",file_query_args.layout.u.raid10.layout_visit_policy); ADIOI_Info_set(fd->info, "panfs_layout_visit_policy", temp_buffer); break; + default: + break; } } } diff --git a/ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs_read.c b/ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs_read.c index dd5635e22d..6dfed04ec9 100644 --- a/ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs_read.c +++ b/ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs_read.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs_resize.c b/ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs_resize.c index bc566cf574..52708f5fcb 100644 --- a/ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs_resize.c +++ b/ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs_resize.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2004 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs_write.c b/ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs_write.c index 2b186b7203..9cd406c9b7 100644 --- a/ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs_write.c +++ b/ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs_write.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2004 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pfs/Makefile.am b/ompi/mca/io/romio/romio/adio/ad_pfs/Makefile.am deleted file mode 100644 index 33d12db478..0000000000 --- a/ompi/mca/io/romio/romio/adio/ad_pfs/Makefile.am +++ /dev/null @@ -1,34 +0,0 @@ -# -# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana -# University Research and Technology -# Corporation. All rights reserved. -# Copyright (c) 2004-2005 The University of Tennessee and The University -# of Tennessee Research Foundation. All rights -# reserved. -# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, -# University of Stuttgart. All rights reserved. -# Copyright (c) 2004-2005 The Regents of the University of California. -# All rights reserved. -# $COPYRIGHT$ -# -# Additional copyrights may follow -# -# $HEADER$ -# - -include $(top_srcdir)/Makefile.options - -noinst_LTLIBRARIES = libadio_pfs.la -libadio_pfs_la_SOURCES = \ - ad_pfs.c \ - ad_pfs_done.c \ - ad_pfs_fcntl.c \ - ad_pfs_flush.c \ - ad_pfs.h \ - ad_pfs_hints.c \ - ad_pfs_iread.c \ - ad_pfs_iwrite.c \ - ad_pfs_open.c \ - ad_pfs_read.c \ - ad_pfs_wait.c \ - ad_pfs_write.c diff --git a/ompi/mca/io/romio/romio/adio/ad_pfs/Makefile.mk b/ompi/mca/io/romio/romio/adio/ad_pfs/Makefile.mk new file mode 100644 index 0000000000..3521c07c86 --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_pfs/Makefile.mk @@ -0,0 +1,26 @@ +## -*- Mode: Makefile; -*- +## vim: set ft=automake : +## +## (C) 2011 by Argonne National Laboratory. +## See COPYRIGHT in top-level directory. +## + +if BUILD_AD_PFS + +noinst_HEADERS += adio/ad_pfs/ad_pfs.h + +romio_other_sources += \ + adio/ad_pfs/ad_pfs_read.c \ + adio/ad_pfs/ad_pfs_open.c \ + adio/ad_pfs/ad_pfs_write.c \ + adio/ad_pfs/ad_pfs_done.c \ + adio/ad_pfs/ad_pfs_fcntl.c \ + adio/ad_pfs/ad_pfs_iread.c \ + adio/ad_pfs/ad_pfs_iwrite.c \ + adio/ad_pfs/ad_pfs_wait.c \ + adio/ad_pfs/ad_pfs_flush.c \ + adio/ad_pfs/ad_pfs_hints.c \ + adio/ad_pfs/ad_pfs.c + +endif BUILD_AD_PFS + diff --git a/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs.c b/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs.c index f5b2262e00..62a4305205 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs.c +++ b/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs.h b/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs.h index 80d808a0b8..fbe055ccf7 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs.h +++ b/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_done.c b/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_done.c index 94c61cd7b4..60e2d7da29 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_done.c +++ b/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_done.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_fcntl.c b/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_fcntl.c index d11d73b671..4a2c0fd382 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_fcntl.c +++ b/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_fcntl.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_flush.c b/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_flush.c index 57cae24535..98dedc099c 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_flush.c +++ b/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_flush.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_hints.c b/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_hints.c index 5815ca0925..407a0eb775 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_hints.c +++ b/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_hints.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_iread.c b/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_iread.c index c181ea8799..b0009a9405 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_iread.c +++ b/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_iread.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_iwrite.c b/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_iwrite.c index a3d3f38e10..dcae718e20 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_iwrite.c +++ b/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_iwrite.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_open.c b/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_open.c index c424af07fa..f814b7c0a1 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_open.c +++ b/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_open.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_read.c b/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_read.c index e148dec309..ff8529d4b4 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_read.c +++ b/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_read.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_wait.c b/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_wait.c index 4719bcc4ba..e14159521a 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_wait.c +++ b/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_wait.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_write.c b/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_write.c index 257114b301..3dbb3363ca 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_write.c +++ b/ompi/mca/io/romio/romio/adio/ad_pfs/ad_pfs_write.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_piofs/Makefile.am b/ompi/mca/io/romio/romio/adio/ad_piofs/Makefile.am deleted file mode 100644 index 6fc828a43f..0000000000 --- a/ompi/mca/io/romio/romio/adio/ad_piofs/Makefile.am +++ /dev/null @@ -1,32 +0,0 @@ -# -# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana -# University Research and Technology -# Corporation. All rights reserved. -# Copyright (c) 2004-2005 The University of Tennessee and The University -# of Tennessee Research Foundation. All rights -# reserved. -# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, -# University of Stuttgart. All rights reserved. -# Copyright (c) 2004-2005 The Regents of the University of California. -# All rights reserved. -# $COPYRIGHT$ -# -# Additional copyrights may follow -# -# $HEADER$ -# - -include $(top_srcdir)/Makefile.options - -EXTRA_DIST = README - -noinst_LTLIBRARIES = libadio_piofs.la -libadio_piofs_la_SOURCES = \ - ad_piofs.c \ - ad_piofs.h \ - ad_piofs_fcntl.c \ - ad_piofs_features.c \ - ad_piofs_hints.c \ - ad_piofs_open.c \ - ad_piofs_read.c \ - ad_piofs_write.c diff --git a/ompi/mca/io/romio/romio/adio/ad_piofs/Makefile.mk b/ompi/mca/io/romio/romio/adio/ad_piofs/Makefile.mk new file mode 100644 index 0000000000..4bcbd61f24 --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_piofs/Makefile.mk @@ -0,0 +1,21 @@ +## -*- Mode: Makefile; -*- +## vim: set ft=automake : +## +## (C) 2011 by Argonne National Laboratory. +## See COPYRIGHT in top-level directory. +## + +if BUILD_AD_PIOFS + +noinst_HEADERS += adio/ad_piofs/ad_piofs.h + +romio_other_sources += \ + adio/ad_piofs/ad_piofs_read.c \ + adio/ad_piofs/ad_piofs_open.c \ + adio/ad_piofs/ad_piofs_write.c \ + adio/ad_piofs/ad_piofs_fcntl.c \ + adio/ad_piofs/ad_piofs_hints.c \ + adio/ad_piofs/ad_piofs.c + +endif BUILD_AD_PIOFS + diff --git a/ompi/mca/io/romio/romio/adio/ad_piofs/ad_piofs.c b/ompi/mca/io/romio/romio/adio/ad_piofs/ad_piofs.c index b602c789bd..29d8c3010d 100644 --- a/ompi/mca/io/romio/romio/adio/ad_piofs/ad_piofs.c +++ b/ompi/mca/io/romio/romio/adio/ad_piofs/ad_piofs.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_piofs/ad_piofs.h b/ompi/mca/io/romio/romio/adio/ad_piofs/ad_piofs.h index 919cdb4cab..e9b74c9e87 100644 --- a/ompi/mca/io/romio/romio/adio/ad_piofs/ad_piofs.h +++ b/ompi/mca/io/romio/romio/adio/ad_piofs/ad_piofs.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_piofs/ad_piofs_fcntl.c b/ompi/mca/io/romio/romio/adio/ad_piofs/ad_piofs_fcntl.c index 13b8501ae1..7d4a37cbfd 100644 --- a/ompi/mca/io/romio/romio/adio/ad_piofs/ad_piofs_fcntl.c +++ b/ompi/mca/io/romio/romio/adio/ad_piofs/ad_piofs_fcntl.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -26,7 +26,7 @@ void ADIOI_PIOFS_Fcntl(ADIO_File fd, int flag, ADIO_Fcntl_t *fcntl_struct, int * if (fd->fp_sys_posn != -1) llseek(fd->fd_sys, fd->fp_sys_posn, SEEK_SET); if (fcntl_struct->fsize == -1) { -#ifdef MPICH2 +#ifdef MPICH *error_code = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_IO, "**io", "**io %s", strerror(errno)); #elif defined(PRINT_ERR_MSG) @@ -56,7 +56,7 @@ void ADIOI_PIOFS_Fcntl(ADIO_File fd, int flag, ADIO_Fcntl_t *fcntl_struct, int * ADIOI_Free(piofs_change_view); fd->atomicity = (fcntl_struct->atomicity == 0) ? 0 : 1; if (err == -1) { -#ifdef MPICH2 +#ifdef MPICH *error_code = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_IO, "**io", "**io %s", strerror(errno)); #elif defined(PRINT_ERR_MSG) diff --git a/ompi/mca/io/romio/romio/adio/ad_piofs/ad_piofs_hints.c b/ompi/mca/io/romio/romio/adio/ad_piofs/ad_piofs_hints.c index 295310512d..242ebb3f07 100644 --- a/ompi/mca/io/romio/romio/adio/ad_piofs/ad_piofs_hints.c +++ b/ompi/mca/io/romio/romio/adio/ad_piofs/ad_piofs_hints.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_piofs/ad_piofs_open.c b/ompi/mca/io/romio/romio/adio/ad_piofs/ad_piofs_open.c index 20c3644c9b..e02e90cf32 100644 --- a/ompi/mca/io/romio/romio/adio/ad_piofs/ad_piofs_open.c +++ b/ompi/mca/io/romio/romio/adio/ad_piofs/ad_piofs_open.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -64,7 +64,7 @@ void ADIOI_PIOFS_Open(ADIO_File fd, int *error_code) } if (fd->fd_sys == -1) { -#ifdef MPICH2 +#ifdef MPICH *error_code = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_IO, "**io", "**io %s", strerror(errno)); #elif defined(PRINT_ERR_MSG) diff --git a/ompi/mca/io/romio/romio/adio/ad_piofs/ad_piofs_read.c b/ompi/mca/io/romio/romio/adio/ad_piofs/ad_piofs_read.c index c25e7e17e2..68946650d5 100644 --- a/ompi/mca/io/romio/romio/adio/ad_piofs/ad_piofs_read.c +++ b/ompi/mca/io/romio/romio/adio/ad_piofs/ad_piofs_read.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -41,7 +41,7 @@ void ADIOI_PIOFS_ReadContig(ADIO_File fd, void *buf, int count, #endif if (err == -1) { -#ifdef MPICH2 +#ifdef MPICH *error_code = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_IO, "**io", "**io %s", strerror(errno)); #elif defined(PRINT_ERR_MSG) diff --git a/ompi/mca/io/romio/romio/adio/ad_piofs/ad_piofs_write.c b/ompi/mca/io/romio/romio/adio/ad_piofs/ad_piofs_write.c index 3f6417108b..8a00b355e8 100644 --- a/ompi/mca/io/romio/romio/adio/ad_piofs/ad_piofs_write.c +++ b/ompi/mca/io/romio/romio/adio/ad_piofs/ad_piofs_write.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -42,7 +42,7 @@ void ADIOI_PIOFS_WriteContig(ADIO_File fd, void *buf, int count, #endif if (err == -1) { -#ifdef MPICH2 +#ifdef MPICH *error_code = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_IO, "**io", "**io %s", strerror(errno)); #elif defined(PRINT_ERR_MSG) @@ -93,6 +93,9 @@ void ADIOI_PIOFS_WriteStrided(ADIO_File fd, void *buf, int count, MPI_Type_size(fd->filetype, &filetype_size); if ( ! filetype_size ) { +#ifdef HAVE_STATUS_SET_BYTES + MPIR_Status_set_bytes(status, datatype, 0); +#endif *error_code = MPI_SUCCESS; return; } @@ -148,7 +151,7 @@ void ADIOI_PIOFS_WriteStrided(ADIO_File fd, void *buf, int count, ADIOI_Free(iov); if (err_flag) { -#ifdef MPICH2 +#ifdef MPICH *error_code = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_IO, "**io", "**io %s", strerror(errno)); #elif defined(PRINT_ERR_MSG) @@ -314,7 +317,7 @@ void ADIOI_PIOFS_WriteStrided(ADIO_File fd, void *buf, int count, if (file_ptr_type == ADIO_INDIVIDUAL) fd->fp_ind = off; if (err_flag) { -#ifdef MPICH2 +#ifdef MPICH *error_code = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_IO, "**io", "**io %s", strerror(errno)); #elif defined(PRINT_ERR_MSG) diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs/Makefile.am b/ompi/mca/io/romio/romio/adio/ad_pvfs/Makefile.am deleted file mode 100644 index 38306e096d..0000000000 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs/Makefile.am +++ /dev/null @@ -1,33 +0,0 @@ -# -# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana -# University Research and Technology -# Corporation. All rights reserved. -# Copyright (c) 2004-2005 The University of Tennessee and The University -# of Tennessee Research Foundation. All rights -# reserved. -# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, -# University of Stuttgart. All rights reserved. -# Copyright (c) 2004-2005 The Regents of the University of California. -# All rights reserved. -# $COPYRIGHT$ -# -# Additional copyrights may follow -# -# $HEADER$ -# - -include $(top_srcdir)/Makefile.options - -noinst_LTLIBRARIES = libadio_pvfs.la -libadio_pvfs_la_SOURCES = \ - ad_pvfs.c \ - ad_pvfs.h \ - ad_pvfs_close.c \ - ad_pvfs_delete.c \ - ad_pvfs_fcntl.c \ - ad_pvfs_flush.c \ - ad_pvfs_hints.c \ - ad_pvfs_open.c \ - ad_pvfs_read.c \ - ad_pvfs_resize.c \ - ad_pvfs_write.c diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs/Makefile.mk b/ompi/mca/io/romio/romio/adio/ad_pvfs/Makefile.mk new file mode 100644 index 0000000000..50e7bd0ae6 --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs/Makefile.mk @@ -0,0 +1,26 @@ +## -*- Mode: Makefile; -*- +## vim: set ft=automake : +## +## (C) 2011 by Argonne National Laboratory. +## See COPYRIGHT in top-level directory. +## + +if BUILD_AD_PVFS + +noinst_HEADERS += adio/ad_pvfs/ad_pvfs.h + +romio_other_sources += \ + adio/ad_pvfs/ad_pvfs_close.c \ + adio/ad_pvfs/ad_pvfs_read.c \ + adio/ad_pvfs/ad_pvfs_open.c \ + adio/ad_pvfs/ad_pvfs_write.c \ + adio/ad_pvfs/ad_pvfs_fcntl.c \ + adio/ad_pvfs/ad_pvfs_flush.c \ + adio/ad_pvfs/ad_pvfs_resize.c \ + adio/ad_pvfs/ad_pvfs_hints.c \ + adio/ad_pvfs/ad_pvfs_delete.c \ + adio/ad_pvfs/ad_pvfs.c + +endif BUILD_AD_PVFS + + diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs.c b/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs.c index 198cc9fb65..92b6df63e9 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs.c +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs.h b/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs.h index 4691c9f09b..88e1a9f225 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs.h +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_close.c b/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_close.c index 517278d0c9..c2da2e360e 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_close.c +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_close.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_delete.c b/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_delete.c index 5e1c46ac97..0e322ad32a 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_delete.c +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_delete.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_fcntl.c b/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_fcntl.c index 33e32732d6..eeff250718 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_fcntl.c +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_fcntl.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_flush.c b/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_flush.c index d378a1315e..340f0cb339 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_flush.c +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_flush.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_hints.c b/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_hints.c index 710aea7708..fdc06ed846 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_hints.c +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_hints.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_open.c b/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_open.c index 535ed04b5b..c4fa28805d 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_open.c +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_open.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_read.c b/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_read.c index f6035218c3..0a6a75b3c6 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_read.c +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_read.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -150,6 +150,9 @@ void ADIOI_PVFS_ReadStridedListIO(ADIO_File fd, void *buf, int count, ADIOI_Datatype_iscontig(fd->filetype, &filetype_is_contig); MPI_Type_size(fd->filetype, &filetype_size); if ( ! filetype_size ) { +#ifdef HAVE_STATUS_SET_BYTES + MPIR_Status_set_bytes(status, datatype, 0); +#endif *error_code = MPI_SUCCESS; return; } diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_resize.c b/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_resize.c index ce72b4c17c..b4b9553633 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_resize.c +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_resize.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_write.c b/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_write.c index 50175f3e51..e43497e729 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_write.c +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs/ad_pvfs_write.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -130,6 +130,9 @@ void ADIOI_PVFS_WriteStrided(ADIO_File fd, void *buf, int count, MPI_Type_size(fd->filetype, &filetype_size); if ( ! filetype_size ) { +#ifdef HAVE_STATUS_SET_BYTES + MPIR_Status_set_bytes(status, datatype, 0); +#endif *error_code = MPI_SUCCESS; return; } @@ -514,6 +517,9 @@ void ADIOI_PVFS_WriteStridedListIO(ADIO_File fd, void *buf, int count, MPI_Type_size(fd->filetype, &filetype_size); if ( ! filetype_size ) { +#ifdef HAVE_STATUS_SET_BYTES + MPIR_Status_set_bytes(status, datatype, 0); +#endif *error_code = MPI_SUCCESS; return; } diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs2/Makefile.am b/ompi/mca/io/romio/romio/adio/ad_pvfs2/Makefile.am deleted file mode 100644 index eeab37e449..0000000000 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs2/Makefile.am +++ /dev/null @@ -1,42 +0,0 @@ -# -# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana -# University Research and Technology -# Corporation. All rights reserved. -# Copyright (c) 2004-2005 The University of Tennessee and The University -# of Tennessee Research Foundation. All rights -# reserved. -# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, -# University of Stuttgart. All rights reserved. -# Copyright (c) 2004-2005 The Regents of the University of California. -# All rights reserved. -# Copyright (c) 2008 Cisco Systems, Inc. All rights reserved. -# $COPYRIGHT$ -# -# Additional copyrights may follow -# -# $HEADER$ -# - -include $(top_srcdir)/Makefile.options - -noinst_LTLIBRARIES = libadio_pvfs2.la -libadio_pvfs2_la_SOURCES = \ - ad_pvfs2.c \ - ad_pvfs2.h \ - ad_pvfs2_common.h \ - ad_pvfs2_close.c \ - ad_pvfs2_common.c \ - ad_pvfs2_delete.c \ - ad_pvfs2_fcntl.c \ - ad_pvfs2_features.c \ - ad_pvfs2_flush.c \ - ad_pvfs2_hints.c \ - ad_pvfs2_io.h \ - ad_pvfs2_io_dtype.c \ - ad_pvfs2_io_list.c \ - ad_pvfs2_open.c \ - ad_pvfs2_read.c \ - ad_pvfs2_read_list_classic.c \ - ad_pvfs2_resize.c \ - ad_pvfs2_write.c \ - ad_pvfs2_write_list_classic.c diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs2/Makefile.mk b/ompi/mca/io/romio/romio/adio/ad_pvfs2/Makefile.mk new file mode 100644 index 0000000000..1ec4848a4b --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs2/Makefile.mk @@ -0,0 +1,32 @@ +## -*- Mode: Makefile; -*- +## vim: set ft=automake : +## +## (C) 2011 by Argonne National Laboratory. +## See COPYRIGHT in top-level directory. +## + +if BUILD_AD_PVFS2 + +noinst_HEADERS += adio/ad_pvfs2/ad_pvfs2.h + +romio_other_sources += \ + adio/ad_pvfs2/ad_pvfs2_close.c \ + adio/ad_pvfs2/ad_pvfs2_read.c \ + adio/ad_pvfs2/ad_pvfs2_open.c \ + adio/ad_pvfs2/ad_pvfs2_write.c \ + adio/ad_pvfs2/ad_pvfs2_fcntl.c \ + adio/ad_pvfs2/ad_pvfs2_flush.c \ + adio/ad_pvfs2/ad_pvfs2_resize.c \ + adio/ad_pvfs2/ad_pvfs2_hints.c \ + adio/ad_pvfs2/ad_pvfs2_delete.c \ + adio/ad_pvfs2/ad_pvfs2.c \ + adio/ad_pvfs2/ad_pvfs2_common.c \ + adio/ad_pvfs2/ad_pvfs2_aio.c \ + adio/ad_pvfs2/ad_pvfs2_read_list_classic.c \ + adio/ad_pvfs2/ad_pvfs2_io_list.c \ + adio/ad_pvfs2/ad_pvfs2_io_dtype.c \ + adio/ad_pvfs2/ad_pvfs2_write_list_classic.c \ + adio/ad_pvfs2/ad_pvfs2_features.c + +endif BUILD_AD_PVFS2 + diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2.c b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2.c index 429457a710..55a752319d 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2.c +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2003 University of Chicago. @@ -23,8 +23,8 @@ struct ADIOI_Fns_struct ADIO_PVFS2_operations = { ADIOI_PVFS2_ReadStrided, /* ReadStrided */ ADIOI_PVFS2_WriteStrided, /* WriteStrided */ ADIOI_PVFS2_Close, /* Close */ - ADIOI_FAKE_IreadContig, /* IreadContig */ - ADIOI_FAKE_IwriteContig, /* IwriteContig */ + ADIOI_PVFS2_IReadContig, /* IreadContig */ + ADIOI_PVFS2_IWriteContig, /* IwriteContig */ ADIOI_FAKE_IODone, /* ReadDone */ ADIOI_FAKE_IODone, /* WriteDone */ ADIOI_FAKE_IOComplete, /* ReadComplete */ diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2.h b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2.h index e3ff045233..618090d882 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2.h +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_aio.c b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_aio.c index 89ca5c2f6b..7ddc935ef4 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_aio.c +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_aio.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- * vim: ts=8 sts=4 sw=4 noexpandtab * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_close.c b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_close.c index 905356852f..847dd8341c 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_close.c +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_close.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_common.c b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_common.c index 4da9eac02a..ccd3c1916c 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_common.c +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_common.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 2003 University of Chicago. * See COPYRIGHT notice in top-level directory. diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_common.h b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_common.h index 42c239adb7..453e2330bc 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_common.h +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_common.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- * vim: ts=8 sts=4 sw=4 noexpandtab * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_delete.c b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_delete.c index 1ab8582dca..cff53e61aa 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_delete.c +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_delete.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2003 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_fcntl.c b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_fcntl.c index 50142e824a..e07291f757 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_fcntl.c +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_fcntl.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_flush.c b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_flush.c index 2caf3ac51c..18061084a8 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_flush.c +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_flush.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_hints.c b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_hints.c index 5170e8afb7..9d3aebb2fb 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_hints.c +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_hints.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_io.h b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_io.h index dc1641ee1b..aefe0653ec 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_io.h +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_io.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- * vim: ts=8 sts=4 sw=4 noexpandtab * * Copyright (C) 2006 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_io_dtype.c b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_io_dtype.c index 8fdc6e9407..1497a12ed1 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_io_dtype.c +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_io_dtype.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- * vim: ts=8 sts=4 sw=4 noexpandtab * * Copyright (C) 2006 University of Chicago. @@ -342,6 +342,12 @@ int convert_mpi_pvfs2_dtype(MPI_Datatype *mpi_dtype, fprintf(stderr, "convert_mpi_pvfs2_dtype: " "INDEXED_BLOCK is unsupported\n"); break; + case MPI_COMBINER_HINDEXED_BLOCK: + /* No native PVFS2 support for this operation currently */ + ADIOI_Free(old_pvfs_dtype); + fprintf(stderr, "convert_mpi_pvfs2_dtype: " + "HINDEXED_BLOCK is unsupported\n"); + break; case MPI_COMBINER_HINDEXED_INTEGER: ADIOI_Free(old_pvfs_dtype); fprintf(stderr, "convert_mpi_pvfs2_dtype: " diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_io_list.c b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_io_list.c index 38cc63e3e1..af524e9819 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_io_list.c +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_io_list.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- * vim: ts=8 sts=4 sw=4 noexpandtab * * Copyright (C) 2006 Unknown (TODO: fix this) diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_open.c b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_open.c index 1175fe252f..c5d933f42b 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_open.c +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_open.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- * vim: ts=8 sts=4 sw=4 noexpandtab * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_read.c b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_read.c index 48009f2537..f745bca361 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_read.c +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_read.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- * vim: ts=8 sts=4 sw=4 noexpandtab * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_read_list_classic.c b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_read_list_classic.c index d5ceefa464..a25228893b 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_read_list_classic.c +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_read_list_classic.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- * vim: ts=8 sts=4 sw=4 noexpandtab * * Copyright (C) 2008 University of Chicago. @@ -70,6 +70,9 @@ void ADIOI_PVFS2_OldReadStrided(ADIO_File fd, void *buf, int count, MPI_Type_size(fd->filetype, &filetype_size); if ( ! filetype_size ) { +#ifdef HAVE_STATUS_SET_BYTES + MPIR_Status_set_bytes(status, datatype, 0); +#endif *error_code = MPI_SUCCESS; return; } diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_resize.c b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_resize.c index 13533773b6..db219db0fd 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_resize.c +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_resize.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_write.c b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_write.c index 47f64ad2fd..e7b2813d96 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_write.c +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_write.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- * vim: ts=8 sts=4 sw=4 noexpandtab * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_write_list_classic.c b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_write_list_classic.c index 413977eef3..c42cde2e62 100644 --- a/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_write_list_classic.c +++ b/ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_write_list_classic.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- * vim: ts=8 sts=4 sw=4 noexpandtab * * Copyright (C) 2008 University of Chicago. @@ -86,6 +86,9 @@ void ADIOI_PVFS2_OldWriteStrided(ADIO_File fd, void *buf, int count, MPI_Type_size(fd->filetype, &filetype_size); if ( ! filetype_size ) { +#ifdef HAVE_STATUS_SET_BYTES + MPIR_Status_set_bytes(status, datatype, 0); +#endif *error_code = MPI_SUCCESS; return; } diff --git a/ompi/mca/io/romio/romio/adio/ad_sfs/Makefile.am b/ompi/mca/io/romio/romio/adio/ad_sfs/Makefile.am deleted file mode 100644 index b18e56bd2c..0000000000 --- a/ompi/mca/io/romio/romio/adio/ad_sfs/Makefile.am +++ /dev/null @@ -1,29 +0,0 @@ -# -# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana -# University Research and Technology -# Corporation. All rights reserved. -# Copyright (c) 2004-2005 The University of Tennessee and The University -# of Tennessee Research Foundation. All rights -# reserved. -# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, -# University of Stuttgart. All rights reserved. -# Copyright (c) 2004-2005 The Regents of the University of California. -# All rights reserved. -# $COPYRIGHT$ -# -# Additional copyrights may follow -# -# $HEADER$ -# - -include $(top_srcdir)/Makefile.options - -EXTRA_DIST = README - -noinst_LTLIBRARIES = libadio_sfs.la -libadio_sfs_la_SOURCES = \ - ad_sfs.c \ - ad_sfs.h \ - ad_sfs_fcntl.c \ - ad_sfs_flush.c \ - ad_sfs_open.c diff --git a/ompi/mca/io/romio/romio/adio/ad_sfs/Makefile.mk b/ompi/mca/io/romio/romio/adio/ad_sfs/Makefile.mk new file mode 100644 index 0000000000..2db1ac26cb --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_sfs/Makefile.mk @@ -0,0 +1,19 @@ +## -*- Mode: Makefile; -*- +## vim: set ft=automake : +## +## (C) 2011 by Argonne National Laboratory. +## See COPYRIGHT in top-level directory. +## + +if BUILD_AD_SFS + +noinst_HEADERS += adio/ad_sfs/ad_sfs.h + +romio_other_sources += \ + adio/ad_sfs/ad_sfs_open.c \ + adio/ad_sfs/ad_sfs_fcntl.c \ + adio/ad_sfs/ad_sfs_flush.c \ + adio/ad_sfs/ad_sfs.c + +endif BUILD_AD_SFS + diff --git a/ompi/mca/io/romio/romio/adio/ad_sfs/ad_sfs.c b/ompi/mca/io/romio/romio/adio/ad_sfs/ad_sfs.c index a4d6cc1135..929dfd97f7 100644 --- a/ompi/mca/io/romio/romio/adio/ad_sfs/ad_sfs.c +++ b/ompi/mca/io/romio/romio/adio/ad_sfs/ad_sfs.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_sfs/ad_sfs.h b/ompi/mca/io/romio/romio/adio/ad_sfs/ad_sfs.h index 875c77dfc3..9f029f0558 100644 --- a/ompi/mca/io/romio/romio/adio/ad_sfs/ad_sfs.h +++ b/ompi/mca/io/romio/romio/adio/ad_sfs/ad_sfs.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_sfs/ad_sfs_fcntl.c b/ompi/mca/io/romio/romio/adio/ad_sfs/ad_sfs_fcntl.c index a18621b6db..533e26a77b 100644 --- a/ompi/mca/io/romio/romio/adio/ad_sfs/ad_sfs_fcntl.c +++ b/ompi/mca/io/romio/romio/adio/ad_sfs/ad_sfs_fcntl.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -34,7 +34,7 @@ void ADIOI_SFS_Fcntl(ADIO_File fd, int flag, ADIO_Fcntl_t *fcntl_struct, int *er if (fd->fp_sys_posn != -1) llseek(fd->fd_sys, fd->fp_sys_posn, SEEK_SET); if (fcntl_struct->fsize == -1) { -#ifdef MPICH2 +#ifdef MPICH *error_code = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_IO, "**io", "**io %s", strerror(errno)); #elif defined(PRINT_ERR_MSG) diff --git a/ompi/mca/io/romio/romio/adio/ad_sfs/ad_sfs_flush.c b/ompi/mca/io/romio/romio/adio/ad_sfs/ad_sfs_flush.c index a6820bea9d..8fc7e358cf 100644 --- a/ompi/mca/io/romio/romio/adio/ad_sfs/ad_sfs_flush.c +++ b/ompi/mca/io/romio/romio/adio/ad_sfs/ad_sfs_flush.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -14,7 +14,7 @@ void ADIOI_SFS_Flush(ADIO_File fd, int *error_code) #endif /* there is no fsync on SX-4 */ -#ifdef MPICH2 +#ifdef MPICH *error_code = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_IO, "**io", "**io %s", strerror(errno)); #elif defined(PRINT_ERR_MSG) diff --git a/ompi/mca/io/romio/romio/adio/ad_sfs/ad_sfs_open.c b/ompi/mca/io/romio/romio/adio/ad_sfs/ad_sfs_open.c index d73af425db..ebeefdcbcb 100644 --- a/ompi/mca/io/romio/romio/adio/ad_sfs/ad_sfs_open.c +++ b/ompi/mca/io/romio/romio/adio/ad_sfs/ad_sfs_open.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -42,7 +42,7 @@ void ADIOI_SFS_Open(ADIO_File fd, int *error_code) } if (fd->fd_sys == -1) { -#ifdef MPICH2 +#ifdef MPICH *error_code = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_IO, "**io", "**io %s", strerror(errno)); #elif defined(PRINT_ERR_MSG) diff --git a/ompi/mca/io/romio/romio/adio/ad_testfs/Makefile.am b/ompi/mca/io/romio/romio/adio/ad_testfs/Makefile.am deleted file mode 100644 index a9d04f5fa9..0000000000 --- a/ompi/mca/io/romio/romio/adio/ad_testfs/Makefile.am +++ /dev/null @@ -1,42 +0,0 @@ -# -# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana -# University Research and Technology -# Corporation. All rights reserved. -# Copyright (c) 2004-2005 The University of Tennessee and The University -# of Tennessee Research Foundation. All rights -# reserved. -# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, -# University of Stuttgart. All rights reserved. -# Copyright (c) 2004-2005 The Regents of the University of California. -# All rights reserved. -# $COPYRIGHT$ -# -# Additional copyrights may follow -# -# $HEADER$ -# - -include $(top_srcdir)/Makefile.options - -noinst_LTLIBRARIES = libadio_testfs.la -libadio_testfs_la_SOURCES = \ - ad_testfs.c \ - ad_testfs.h \ - ad_testfs_close.c \ - ad_testfs_delete.c \ - ad_testfs_done.c \ - ad_testfs_fcntl.c \ - ad_testfs_flush.c \ - ad_testfs_getsh.c \ - ad_testfs_hints.c \ - ad_testfs_iread.c \ - ad_testfs_iwrite.c \ - ad_testfs_open.c \ - ad_testfs_rdcoll.c \ - ad_testfs_read.c \ - ad_testfs_resize.c \ - ad_testfs_seek.c \ - ad_testfs_setsh.c \ - ad_testfs_wait.c \ - ad_testfs_wrcoll.c \ - ad_testfs_write.c diff --git a/ompi/mca/io/romio/romio/adio/ad_testfs/Makefile.mk b/ompi/mca/io/romio/romio/adio/ad_testfs/Makefile.mk new file mode 100644 index 0000000000..7f9c617217 --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_testfs/Makefile.mk @@ -0,0 +1,32 @@ +## -*- Mode: Makefile; -*- +## vim: set ft=automake : +## +## (C) 2011 by Argonne National Laboratory. +## See COPYRIGHT in top-level directory. +## + +if BUILD_AD_TESTFS + +noinst_HEADERS += adio/ad_testfs/ad_testfs.h + +romio_other_sources += \ + adio/ad_testfs/ad_testfs_close.c \ + adio/ad_testfs/ad_testfs_read.c \ + adio/ad_testfs/ad_testfs_rdcoll.c \ + adio/ad_testfs/ad_testfs_wrcoll.c \ + adio/ad_testfs/ad_testfs_open.c \ + adio/ad_testfs/ad_testfs_write.c \ + adio/ad_testfs/ad_testfs_done.c \ + adio/ad_testfs/ad_testfs_fcntl.c \ + adio/ad_testfs/ad_testfs_iread.c \ + adio/ad_testfs/ad_testfs_iwrite.c \ + adio/ad_testfs/ad_testfs_wait.c \ + adio/ad_testfs/ad_testfs_flush.c \ + adio/ad_testfs/ad_testfs_seek.c \ + adio/ad_testfs/ad_testfs_resize.c \ + adio/ad_testfs/ad_testfs_hints.c \ + adio/ad_testfs/ad_testfs_delete.c \ + adio/ad_testfs/ad_testfs.c + +endif BUILD_AD_TESTFS + diff --git a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs.c b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs.c index 36286c7a6e..c315a24e4d 100644 --- a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs.c +++ b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs.h b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs.h index 409aae6722..1871bde5b5 100644 --- a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs.h +++ b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. @@ -16,15 +16,15 @@ void ADIOI_TESTFS_Open(ADIO_File fd, int *error_code); void ADIOI_TESTFS_Close(ADIO_File fd, int *error_code); -void ADIOI_TESTFS_ReadContig(ADIO_File fd, void *buf, int count, +void ADIOI_TESTFS_ReadContig(ADIO_File fd, void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code); -void ADIOI_TESTFS_WriteContig(ADIO_File fd, void *buf, int count, +void ADIOI_TESTFS_WriteContig(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code); -void ADIOI_TESTFS_IwriteContig(ADIO_File fd, void *buf, int count, +void ADIOI_TESTFS_IwriteContig(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Request *request, int *error_code); @@ -42,7 +42,7 @@ void ADIOI_TESTFS_WriteComplete(ADIO_Request *request, ADIO_Status *status, int *error_code); void ADIOI_TESTFS_Fcntl(ADIO_File fd, int flag, ADIO_Fcntl_t *fcntl_struct, int *error_code); -void ADIOI_TESTFS_WriteStrided(ADIO_File fd, void *buf, int count, +void ADIOI_TESTFS_WriteStrided(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code); @@ -50,7 +50,7 @@ void ADIOI_TESTFS_ReadStrided(ADIO_File fd, void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code); -void ADIOI_TESTFS_WriteStridedColl(ADIO_File fd, void *buf, int count, +void ADIOI_TESTFS_WriteStridedColl(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code); @@ -62,7 +62,7 @@ void ADIOI_TESTFS_IreadStrided(ADIO_File fd, void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Request *request, int *error_code); -void ADIOI_TESTFS_IwriteStrided(ADIO_File fd, void *buf, int count, +void ADIOI_TESTFS_IwriteStrided(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Request *request, int *error_code); @@ -76,7 +76,7 @@ void ADIOI_TESTFS_Get_shared_fp(ADIO_File fd, int size, int *error_code); void ADIOI_TESTFS_Set_shared_fp(ADIO_File fd, ADIO_Offset offset, int *error_code); -void ADIOI_TESTFS_Delete(char *filename, int *error_code); +void ADIOI_TESTFS_Delete(const char *filename, int *error_code); #endif diff --git a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_close.c b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_close.c index 2c5076df00..a1b85e600d 100644 --- a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_close.c +++ b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_close.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_delete.c b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_delete.c index 502b5f57f7..9a1b6f37e1 100644 --- a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_delete.c +++ b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_delete.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. @@ -8,7 +8,7 @@ #include "ad_testfs.h" #include "adioi.h" -void ADIOI_TESTFS_Delete(char *filename, int *error_code) +void ADIOI_TESTFS_Delete(const char *filename, int *error_code) { int myrank, nprocs; diff --git a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_done.c b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_done.c index 65ab055998..2ee3111587 100644 --- a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_done.c +++ b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_done.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_fcntl.c b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_fcntl.c index 7842a6b5fa..8b1e516d9a 100644 --- a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_fcntl.c +++ b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_fcntl.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_flush.c b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_flush.c index 84b041a8fb..23d559787d 100644 --- a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_flush.c +++ b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_flush.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_getsh.c b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_getsh.c index d087845792..2bdb3dceb8 100644 --- a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_getsh.c +++ b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_getsh.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_hints.c b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_hints.c index a7b1b7540f..d57c080a56 100644 --- a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_hints.c +++ b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_hints.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_iread.c b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_iread.c index 09a744d5d7..052b28cdca 100644 --- a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_iread.c +++ b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_iread.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_iwrite.c b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_iwrite.c index 15e013104b..7a7261c924 100644 --- a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_iwrite.c +++ b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_iwrite.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. @@ -15,7 +15,7 @@ * * Implemented by immediately calling WriteContig() */ -void ADIOI_TESTFS_IwriteContig(ADIO_File fd, void *buf, int count, +void ADIOI_TESTFS_IwriteContig(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Request *request, int *error_code) @@ -40,7 +40,7 @@ void ADIOI_TESTFS_IwriteContig(ADIO_File fd, void *buf, int count, } -void ADIOI_TESTFS_IwriteStrided(ADIO_File fd, void *buf, int count, +void ADIOI_TESTFS_IwriteStrided(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Request *request, int *error_code) diff --git a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_open.c b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_open.c index acd4b80315..6b1595b99c 100644 --- a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_open.c +++ b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_open.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_rdcoll.c b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_rdcoll.c index 99e96d93df..5df94458fd 100644 --- a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_rdcoll.c +++ b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_rdcoll.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_read.c b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_read.c index bf911d460c..48f5c30296 100644 --- a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_read.c +++ b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_read.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 2001 University of Chicago. * See COPYRIGHT notice in top-level directory. diff --git a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_resize.c b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_resize.c index 9e18ec7467..a4a37eb94b 100644 --- a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_resize.c +++ b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_resize.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_seek.c b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_seek.c index 4b23bc7940..d5ef7c31eb 100644 --- a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_seek.c +++ b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_seek.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_setsh.c b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_setsh.c index 30cf7d65f9..6fc8a04be9 100644 --- a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_setsh.c +++ b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_setsh.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_wait.c b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_wait.c index ac520f7039..6eef9ef706 100644 --- a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_wait.c +++ b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_wait.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_wrcoll.c b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_wrcoll.c index c9c5f75d02..ac11f5847f 100644 --- a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_wrcoll.c +++ b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_wrcoll.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. @@ -8,7 +8,7 @@ #include "ad_testfs.h" #include "adioi.h" -void ADIOI_TESTFS_WriteStridedColl(ADIO_File fd, void *buf, int count, +void ADIOI_TESTFS_WriteStridedColl(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code) diff --git a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_write.c b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_write.c index c3eea50f60..14a28a844b 100644 --- a/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_write.c +++ b/ompi/mca/io/romio/romio/adio/ad_testfs/ad_testfs_write.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 2001 University of Chicago. * See COPYRIGHT notice in top-level directory. @@ -7,7 +7,7 @@ #include "ad_testfs.h" #include "adioi.h" -void ADIOI_TESTFS_WriteContig(ADIO_File fd, void *buf, int count, +void ADIOI_TESTFS_WriteContig(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code) @@ -41,7 +41,7 @@ void ADIOI_TESTFS_WriteContig(ADIO_File fd, void *buf, int count, #endif } -void ADIOI_TESTFS_WriteStrided(ADIO_File fd, void *buf, int count, +void ADIOI_TESTFS_WriteStrided(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code) diff --git a/ompi/mca/io/romio/romio/adio/ad_ufs/Makefile.am b/ompi/mca/io/romio/romio/adio/ad_ufs/Makefile.am deleted file mode 100644 index b60b6644ff..0000000000 --- a/ompi/mca/io/romio/romio/adio/ad_ufs/Makefile.am +++ /dev/null @@ -1,25 +0,0 @@ -# -# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana -# University Research and Technology -# Corporation. All rights reserved. -# Copyright (c) 2004-2005 The University of Tennessee and The University -# of Tennessee Research Foundation. All rights -# reserved. -# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, -# University of Stuttgart. All rights reserved. -# Copyright (c) 2004-2005 The Regents of the University of California. -# All rights reserved. -# $COPYRIGHT$ -# -# Additional copyrights may follow -# -# $HEADER$ -# - -include $(top_srcdir)/Makefile.options - -noinst_LTLIBRARIES = libadio_ufs.la -libadio_ufs_la_SOURCES = \ - ad_ufs.c \ - ad_ufs.h \ - ad_ufs_open.c diff --git a/ompi/mca/io/romio/romio/adio/ad_ufs/Makefile.mk b/ompi/mca/io/romio/romio/adio/ad_ufs/Makefile.mk new file mode 100644 index 0000000000..40ecdb4ae4 --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_ufs/Makefile.mk @@ -0,0 +1,17 @@ +## -*- Mode: Makefile; -*- +## vim: set ft=automake : +## +## (C) 2011 by Argonne National Laboratory. +## See COPYRIGHT in top-level directory. +## + +if BUILD_AD_UFS + +noinst_HEADERS += adio/ad_ufs/ad_ufs.h + +romio_other_sources += \ + adio/ad_ufs/ad_ufs.c \ + adio/ad_ufs/ad_ufs_open.c + +endif BUILD_AD_UFS + diff --git a/ompi/mca/io/romio/romio/adio/ad_ufs/ad_ufs.c b/ompi/mca/io/romio/romio/adio/ad_ufs/ad_ufs.c index 014222a508..75488da16a 100644 --- a/ompi/mca/io/romio/romio/adio/ad_ufs/ad_ufs.c +++ b/ompi/mca/io/romio/romio/adio/ad_ufs/ad_ufs.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_ufs/ad_ufs.h b/ompi/mca/io/romio/romio/adio/ad_ufs/ad_ufs.h index 56b988539c..5ad27439b3 100644 --- a/ompi/mca/io/romio/romio/adio/ad_ufs/ad_ufs.h +++ b/ompi/mca/io/romio/romio/adio/ad_ufs/ad_ufs.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. diff --git a/ompi/mca/io/romio/romio/adio/ad_ufs/ad_ufs_open.c b/ompi/mca/io/romio/romio/adio/ad_ufs/ad_ufs_open.c index 1a154fa97e..1a8ee3b2df 100644 --- a/ompi/mca/io/romio/romio/adio/ad_ufs/ad_ufs_open.c +++ b/ompi/mca/io/romio/romio/adio/ad_ufs/ad_ufs_open.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_xfs/Makefile.am b/ompi/mca/io/romio/romio/adio/ad_xfs/Makefile.am deleted file mode 100644 index b077408789..0000000000 --- a/ompi/mca/io/romio/romio/adio/ad_xfs/Makefile.am +++ /dev/null @@ -1,30 +0,0 @@ -# -# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana -# University Research and Technology -# Corporation. All rights reserved. -# Copyright (c) 2004-2005 The University of Tennessee and The University -# of Tennessee Research Foundation. All rights -# reserved. -# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, -# University of Stuttgart. All rights reserved. -# Copyright (c) 2004-2005 The Regents of the University of California. -# All rights reserved. -# $COPYRIGHT$ -# -# Additional copyrights may follow -# -# $HEADER$ -# - -include $(top_srcdir)/Makefile.options - -noinst_LTLIBRARIES = libadio_xfs.la -libadio_xfs_la_SOURCES = \ - ad_xfs.c \ - ad_xfs.h \ - ad_xfs_fcntl.c \ - ad_xfs_hints.c \ - ad_xfs_open.c \ - ad_xfs_read.c \ - ad_xfs_resize.c \ - ad_xfs_write.c diff --git a/ompi/mca/io/romio/romio/adio/ad_xfs/Makefile.mk b/ompi/mca/io/romio/romio/adio/ad_xfs/Makefile.mk new file mode 100644 index 0000000000..9a2d7078a3 --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_xfs/Makefile.mk @@ -0,0 +1,22 @@ +## -*- Mode: Makefile; -*- +## vim: set ft=automake : +## +## (C) 2011 by Argonne National Laboratory. +## See COPYRIGHT in top-level directory. +## + +if BUILD_AD_XFS + +noinst_HEADERS += adio/ad_xfs/ad_xfs.h + +romio_other_sources += \ + adio/ad_xfs/ad_xfs.c \ + adio/ad_xfs/ad_xfs_fcntl.c \ + adio/ad_xfs/ad_xfs_hints.c \ + adio/ad_xfs/ad_xfs_open.c \ + adio/ad_xfs/ad_xfs_read.c \ + adio/ad_xfs/ad_xfs_resize.c \ + adio/ad_xfs/ad_xfs_write.c + +endif BUILD_AD_XFS + diff --git a/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs.c b/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs.c index 07730aa2d7..2b963472e3 100644 --- a/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs.c +++ b/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs.h b/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs.h index c529abcd91..048d1565e8 100644 --- a/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs.h +++ b/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs_fcntl.c b/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs_fcntl.c index 7c49da24da..1f19081afc 100644 --- a/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs_fcntl.c +++ b/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs_fcntl.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs_hints.c b/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs_hints.c index 97909b3819..0fe0e832f4 100644 --- a/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs_hints.c +++ b/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs_hints.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs_open.c b/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs_open.c index fa073fb316..eba5093417 100644 --- a/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs_open.c +++ b/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs_open.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs_read.c b/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs_read.c index 38b28f0e3b..1fb127456d 100644 --- a/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs_read.c +++ b/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs_read.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs_resize.c b/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs_resize.c index 9a840911ea..8caf8b48bd 100644 --- a/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs_resize.c +++ b/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs_resize.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs_write.c b/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs_write.c index ecb9c7b801..dc54e7dec1 100644 --- a/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs_write.c +++ b/ompi/mca/io/romio/romio/adio/ad_xfs/ad_xfs_write.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_zoidfs/Makefile.am b/ompi/mca/io/romio/romio/adio/ad_zoidfs/Makefile.am deleted file mode 100644 index 22e2e83772..0000000000 --- a/ompi/mca/io/romio/romio/adio/ad_zoidfs/Makefile.am +++ /dev/null @@ -1,35 +0,0 @@ -# -# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana -# University Research and Technology -# Corporation. All rights reserved. -# Copyright (c) 2004-2005 The University of Tennessee and The University -# of Tennessee Research Foundation. All rights -# reserved. -# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, -# University of Stuttgart. All rights reserved. -# Copyright (c) 2004-2005 The Regents of the University of California. -# All rights reserved. -# $COPYRIGHT$ -# -# Additional copyrights may follow -# -# $HEADER$ -# - -include $(top_srcdir)/Makefile.options - -noinst_LTLIBRARIES = libadio_zoidfs.la -libadio_zoidfs_la_SOURCES = \ - ad_zoidfs.c \ - ad_zoidfs_close.c \ - ad_zoidfs_common.c \ - ad_zoidfs_delete.c \ - ad_zoidfs_fcntl.c \ - ad_zoidfs_flush.c \ - ad_zoidfs_io.c \ - ad_zoidfs_open.c \ - ad_zoidfs_resize.c \ - ad_zoidfs_features.c \ - ad_zoidfs_read_list.c \ - ad_zoidfs_write_list.c - diff --git a/ompi/mca/io/romio/romio/adio/ad_zoidfs/Makefile.mk b/ompi/mca/io/romio/romio/adio/ad_zoidfs/Makefile.mk new file mode 100644 index 0000000000..a26e59c8e0 --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/ad_zoidfs/Makefile.mk @@ -0,0 +1,27 @@ +## -*- Mode: Makefile; -*- +## vim: set ft=automake : +## +## (C) 2011 by Argonne National Laboratory. +## See COPYRIGHT in top-level directory. +## + +if BUILD_AD_ZOIDFS + +noinst_HEADERS += adio/ad_zoidfs/ad_zoidfs.h adio/ad_zoidfs/ad_zoidfs_common.h + +romio_other_sources += \ + adio/ad_zoidfs/ad_zoidfs.c \ + adio/ad_zoidfs/ad_zoidfs_close.c \ + adio/ad_zoidfs/ad_zoidfs_common.c \ + adio/ad_zoidfs/ad_zoidfs_delete.c \ + adio/ad_zoidfs/ad_zoidfs_fcntl.c \ + adio/ad_zoidfs/ad_zoidfs_flush.c \ + adio/ad_zoidfs/ad_zoidfs_io.c \ + adio/ad_zoidfs/ad_zoidfs_open.c \ + adio/ad_zoidfs/ad_zoidfs_resize.c \ + adio/ad_zoidfs/ad_zoidfs_features.c \ + adio/ad_zoidfs/ad_zoidfs_read_list.c \ + adio/ad_zoidfs/ad_zoidfs_write_list.c + +endif BUILD_AD_ZOIDFS + diff --git a/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs.c b/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs.c index 28b8ea54e6..a0eadfba69 100644 --- a/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs.c +++ b/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2003 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs.h b/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs.h index 03b2a57662..d4999b6622 100644 --- a/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs.h +++ b/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_close.c b/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_close.c index 1bee6b83e9..0126783aa3 100644 --- a/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_close.c +++ b/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_close.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_common.c b/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_common.c index 3437359da7..018d439aaa 100644 --- a/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_common.c +++ b/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_common.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 2003 University of Chicago. * See COPYRIGHT notice in top-level directory. diff --git a/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_common.h b/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_common.h index b519f791dd..ba985b4922 100644 --- a/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_common.h +++ b/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_common.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- * vim: ts=8 sts=4 sw=4 noexpandtab * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_delete.c b/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_delete.c index 58d3bc0bb9..87193147a5 100644 --- a/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_delete.c +++ b/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_delete.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2003 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_fcntl.c b/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_fcntl.c index 04cd2b8f9c..22c26714d8 100644 --- a/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_fcntl.c +++ b/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_fcntl.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_flush.c b/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_flush.c index 6191dada1d..8ec0b8d551 100644 --- a/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_flush.c +++ b/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_flush.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_io.c b/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_io.c index f785d0da84..41adb19cd8 100644 --- a/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_io.c +++ b/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_io.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- * * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. diff --git a/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_open.c b/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_open.c index f0d5484223..55fb950a3e 100644 --- a/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_open.c +++ b/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_open.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- * vim: ts=8 sts=4 sw=4 noexpandtab * * Copyright (C) 2007 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_read_list.c b/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_read_list.c index ac3bf5d6bd..fca7e50db1 100644 --- a/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_read_list.c +++ b/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_read_list.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- * vim: ts=8 sts=4 sw=4 noexpandtab * * Copyright (C) 2008 University of Chicago. @@ -72,6 +72,9 @@ void ADIOI_ZOIDFS_ReadStrided(ADIO_File fd, void *buf, int count, MPI_Type_size(fd->filetype, &filetype_size); if ( ! filetype_size ) { +#ifdef HAVE_STATUS_SET_BYTES + MPIR_Status_set_bytes(status, datatype, 0); +#endif *error_code = MPI_SUCCESS; return; } diff --git a/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_resize.c b/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_resize.c index de000f1e6e..60d2fcaba2 100644 --- a/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_resize.c +++ b/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_resize.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_write_list.c b/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_write_list.c index 5ecf0c82ed..1b6b7813ca 100644 --- a/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_write_list.c +++ b/ompi/mca/io/romio/romio/adio/ad_zoidfs/ad_zoidfs_write_list.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- * vim: ts=8 sts=4 sw=4 noexpandtab * * Copyright (C) 2008 University of Chicago. @@ -86,6 +86,9 @@ void ADIOI_ZOIDFS_WriteStrided(ADIO_File fd, void *buf, int count, MPI_Type_size(fd->filetype, &filetype_size); if ( ! filetype_size ) { +#ifdef HAVE_STATUS_SET_BYTES + MPIR_Status_set_bytes(status, datatype, 0); +#endif *error_code = MPI_SUCCESS; return; } diff --git a/ompi/mca/io/romio/romio/adio/common/Makefile.am b/ompi/mca/io/romio/romio/adio/common/Makefile.am deleted file mode 100644 index eebfa5dd7c..0000000000 --- a/ompi/mca/io/romio/romio/adio/common/Makefile.am +++ /dev/null @@ -1,87 +0,0 @@ -# -# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana -# University Research and Technology -# Corporation. All rights reserved. -# Copyright (c) 2004-2005 The University of Tennessee and The University -# of Tennessee Research Foundation. All rights -# reserved. -# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, -# University of Stuttgart. All rights reserved. -# Copyright (c) 2004-2005 The Regents of the University of California. -# All rights reserved. -# Copyright (c) 2008 Cisco Systems, Inc. All rights reserved. -# $COPYRIGHT$ -# -# Additional copyrights may follow -# -# $HEADER$ -# - -include $(top_srcdir)/Makefile.options - -# Deliberately did not include async_list.c and req_malloc.c because -# MPICH2-1.0.7 doesn't compile async_list.c and req_malloc.c is only -# required for MPIX_Grequest stuff (which is MPICH2-specific). - -noinst_LTLIBRARIES = libadio_common.la -libadio_common_la_SOURCES = \ - ad_aggregate.c \ - ad_aggregate_new.c \ - ad_close.c \ - ad_coll_build_req_new.c \ - ad_coll_exch_new.c \ - ad_darray.c \ - ad_delete.c \ - ad_done.c \ - ad_done_fake.c \ - ad_end.c \ - ad_features.c \ - ad_fcntl.c \ - ad_flush.c \ - ad_fstype.c \ - ad_get_sh_fp.c \ - ad_hints.c \ - ad_init.c \ - ad_io_coll.c \ - ad_iopen.c \ - ad_iread.c \ - ad_iread_fake.c \ - ad_iwrite.c \ - ad_iwrite_fake.c \ - ad_open.c \ - ad_opencoll.c \ - ad_opencoll_failsafe.c \ - ad_opencoll_scalable.c \ - ad_prealloc.c \ - ad_read.c \ - ad_read_coll.c \ - ad_read_str.c \ - ad_read_str_naive.c \ - ad_resize.c \ - ad_seek.c \ - ad_set_sh_fp.c \ - ad_set_view.c \ - ad_subarray.c \ - ad_wait.c \ - ad_wait_fake.c \ - ad_write.c \ - ad_write_coll.c \ - ad_write_nolock.c \ - ad_write_str.c \ - ad_write_str_naive.c \ - adi_close.c \ - byte_offset.c \ - cb_config_list.c \ - eof_offset.c \ - error.c \ - flatten.c \ - get_fp_posn.c \ - greq_fns.c \ - heap-sort.c \ - iscontig.c \ - lock.c \ - malloc.c \ - shfp_fname.c \ - status_setb.c \ - strfns.c \ - system_hints.c diff --git a/ompi/mca/io/romio/romio/adio/common/Makefile.mk b/ompi/mca/io/romio/romio/adio/common/Makefile.mk new file mode 100644 index 0000000000..1bed978921 --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/common/Makefile.mk @@ -0,0 +1,69 @@ +## -*- Mode: Makefile; -*- +## vim: set ft=automake : +## +## (C) 2011 by Argonne National Laboratory. +## See COPYRIGHT in top-level directory. +## + +romio_other_sources += \ + adio/common/ad_aggregate.c \ + adio/common/ad_aggregate_new.c \ + adio/common/ad_close.c \ + adio/common/ad_coll_build_req_new.c \ + adio/common/ad_coll_exch_new.c \ + adio/common/ad_darray.c \ + adio/common/ad_delete.c \ + adio/common/ad_done.c \ + adio/common/ad_done_fake.c \ + adio/common/ad_end.c \ + adio/common/ad_fcntl.c \ + adio/common/ad_features.c \ + adio/common/ad_flush.c \ + adio/common/ad_fstype.c \ + adio/common/ad_get_sh_fp.c \ + adio/common/ad_hints.c \ + adio/common/ad_init.c \ + adio/common/ad_io_coll.c \ + adio/common/ad_iopen.c \ + adio/common/ad_iread.c \ + adio/common/ad_iread_fake.c \ + adio/common/ad_iwrite.c \ + adio/common/ad_iwrite_fake.c \ + adio/common/ad_open.c \ + adio/common/ad_opencoll.c \ + adio/common/ad_opencoll_failsafe.c \ + adio/common/ad_opencoll_scalable.c \ + adio/common/ad_prealloc.c \ + adio/common/ad_read.c \ + adio/common/ad_read_coll.c \ + adio/common/ad_read_str.c \ + adio/common/ad_read_str_naive.c \ + adio/common/ad_resize.c \ + adio/common/ad_seek.c \ + adio/common/ad_set_sh_fp.c \ + adio/common/ad_set_view.c \ + adio/common/ad_subarray.c \ + adio/common/ad_wait.c \ + adio/common/ad_wait_fake.c \ + adio/common/ad_write.c \ + adio/common/ad_write_coll.c \ + adio/common/ad_write_nolock.c \ + adio/common/ad_write_str.c \ + adio/common/ad_write_str_naive.c \ + adio/common/adi_close.c \ + adio/common/byte_offset.c \ + adio/common/cb_config_list.c \ + adio/common/eof_offset.c \ + adio/common/error.c \ + adio/common/flatten.c \ + adio/common/get_fp_posn.c \ + adio/common/greq_fns.c \ + adio/common/heap-sort.c \ + adio/common/iscontig.c \ + adio/common/lock.c \ + adio/common/malloc.c \ + adio/common/shfp_fname.c \ + adio/common/status_setb.c \ + adio/common/strfns.c \ + adio/common/system_hints.c + diff --git a/ompi/mca/io/romio/romio/adio/common/ad_aggregate.c b/ompi/mca/io/romio/romio/adio/common/ad_aggregate.c index ab5d3636e4..4749256490 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_aggregate.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_aggregate.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997-2001 University of Chicago. * See COPYRIGHT notice in top-level directory. diff --git a/ompi/mca/io/romio/romio/adio/common/ad_aggregate_new.c b/ompi/mca/io/romio/romio/adio/common/ad_aggregate_new.c index 5f0802be9b..ba5af6b0c3 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_aggregate_new.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_aggregate_new.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 2008 University of Chicago. * See COPYRIGHT notice in top-level directory. diff --git a/ompi/mca/io/romio/romio/adio/common/ad_close.c b/ompi/mca/io/romio/romio/adio/common/ad_close.c index a4decdd302..ada4d33c78 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_close.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_close.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/common/ad_coll_build_req_new.c b/ompi/mca/io/romio/romio/adio/common/ad_coll_build_req_new.c index 3f3201bf1a..4512153da3 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_coll_build_req_new.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_coll_build_req_new.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -342,7 +342,7 @@ static inline int find_next_off(ADIO_File fd, ADIOI_Flatlist_node *tmp_flat_type_p = NULL; ADIO_Offset tmp_off = -1, fr_next_off = -1, fr_max_len = -1, tmp_fr_max_len = -1; - int ret = -1; + int ret = 0; flatten_state *tmp_state_p = NULL; ADIO_Offset tmp_st_off = 0, tmp_reg_sz = 0; #ifdef DTYPE_SKIP @@ -438,7 +438,7 @@ static inline int find_next_off(ADIO_File fd, #ifdef AGGREGATION_PROFILE /* MPE_Log_event (5023, 0, NULL); */ #endif - return 0; + return ret; } /* Upon completion of a full collective buffer, end of a file realm @@ -905,7 +905,7 @@ int ADIOI_Build_client_reqs(ADIO_File fd, int cb_node_ct = fd->hints->cb_nodes; int *agg_ol_ct_arr = NULL; int *agg_ol_cur_ct_arr = NULL; - int agg_fr_idx = -1, tmp_agg_fr_idx = -1; + int tmp_agg_fr_idx = -1; int cur_off_proc = -1; int i = 0, j = 0; int agg_next_off_idx = -1; @@ -1008,7 +1008,6 @@ int ADIOI_Build_client_reqs(ADIO_File fd, if ((cur_off == -1) || (cur_off > tmp_cur_off)) { - agg_fr_idx = tmp_agg_fr_idx; cur_off_proc = j; cur_off = tmp_cur_off; cur_reg_max_len = tmp_cur_reg_max_len; diff --git a/ompi/mca/io/romio/romio/adio/common/ad_coll_exch_new.c b/ompi/mca/io/romio/romio/adio/common/ad_coll_exch_new.c index 25473f6548..10a441c9f0 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_coll_exch_new.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_coll_exch_new.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -48,12 +48,12 @@ void ADIOI_Print_flatlist_node(ADIOI_Flatlist_node *flatlist_node_p) { if (i % 5 == 0 && i != 0) { - fprintf(stderr, "%d=(%Ld,%Ld)\n", i, flatlist_node_p->indices[i], - flatlist_node_p->blocklens[i]); + fprintf(stderr, "%d=(%lld,%lld)\n", i, (long long)flatlist_node_p->indices[i], + (long long)flatlist_node_p->blocklens[i]); } else - fprintf(stderr, "%d=(%Ld,%Ld) ", i, flatlist_node_p->indices[i], - flatlist_node_p->blocklens[i]); + fprintf(stderr, "%d=(%lld,%lld) ", i, (long long)flatlist_node_p->indices[i], + (long long)flatlist_node_p->blocklens[i]); } fprintf(stderr, "\n"); } @@ -133,7 +133,7 @@ void ADIOI_Exch_file_views(int myrank, int nprocs, int file_ptr_type, /* parameters for datatypes */ ADIOI_Flatlist_node *flat_mem_p = NULL, *flat_file_p = NULL; int memtype_sz = -1; - int memtype_is_contig = -1, filetype_is_contig = -1; + int memtype_is_contig = -1; int filetype_sz = -1; #ifdef AGGREGATION_PROFILE @@ -159,7 +159,6 @@ void ADIOI_Exch_file_views(int myrank, int nprocs, int file_ptr_type, MPI_Type_extent(fd->filetype, &filetype_extent); MPI_Type_size(fd->filetype, &filetype_sz); if (filetype_extent == filetype_sz) { - filetype_is_contig = 1; flat_file_p = ADIOI_Add_contig_flattened(fd->filetype); flat_file_p->blocklens[0] = memtype_sz*count; filetype_extent = memtype_sz*count; @@ -397,7 +396,7 @@ void ADIOI_Exch_file_views(int myrank, int nprocs, int file_ptr_type, INDICES, fd->comm, &recv_req_arr[j]); j++; MPI_Irecv(client_file_view_state_arr[i].flat_type_p->blocklens, - recv_count_arr[i].count, MPI_INT, i, + recv_count_arr[i].count, ADIO_OFFSET, i, BLOCK_LENS, fd->comm, &recv_req_arr[j]); j++; } @@ -413,7 +412,7 @@ void ADIOI_Exch_file_views(int myrank, int nprocs, int file_ptr_type, INDICES, fd->comm, &send_req_arr[j]); j++; MPI_Isend(flat_file_p->blocklens, - send_count_arr[i].count, MPI_INT, i, + send_count_arr[i].count, ADIO_OFFSET, i, BLOCK_LENS, fd->comm, &send_req_arr[j]); j++; } @@ -428,7 +427,7 @@ void ADIOI_Exch_file_views(int myrank, int nprocs, int file_ptr_type, &send_req_arr[j]); j++; MPI_Isend(flat_file_p->blocklens, - send_count_arr[i].count, MPI_INT, + send_count_arr[i].count, ADIO_OFFSET, fd->hints->ranklist[i], BLOCK_LENS, fd->comm, &send_req_arr[j]); j++; diff --git a/ompi/mca/io/romio/romio/adio/common/ad_darray.c b/ompi/mca/io/romio/romio/adio/common/ad_darray.c index faa2cf694d..23715c412f 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_darray.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_darray.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/common/ad_delete.c b/ompi/mca/io/romio/romio/adio/common/ad_delete.c index bc00d7294c..5e960ba585 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_delete.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_delete.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -11,7 +11,7 @@ #include #endif -void ADIOI_GEN_Delete(char *filename, int *error_code) +void ADIOI_GEN_Delete(const char *filename, int *error_code) { int err; static char myname[] = "ADIOI_GEN_DELETE"; diff --git a/ompi/mca/io/romio/romio/adio/common/ad_done.c b/ompi/mca/io/romio/romio/adio/common/ad_done.c index 43d7a66b1d..fe489780b6 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_done.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_done.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2004 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/common/ad_done_fake.c b/ompi/mca/io/romio/romio/adio/common/ad_done_fake.c index 0f707f2fde..59da5755e0 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_done_fake.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_done_fake.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2004 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/common/ad_end.c b/ompi/mca/io/romio/romio/adio/common/ad_end.c index 9b05af3e3d..066c65c27e 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_end.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_end.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. @@ -6,9 +6,6 @@ #include "adio.h" #include "adio_extern.h" -#ifdef ROMIO_INSIDE_MPICH2 -#include "mpiimpl.h" -#endif void ADIO_End(int *error_code) { @@ -48,11 +45,7 @@ void ADIO_End(int *error_code) datarep = ADIOI_Datarep_head; while (datarep) { datarep_next = datarep->next; -#ifdef HAVE_MPIU_FUNCS - MPIU_Free(datarep->name); -#else ADIOI_Free(datarep->name); -#endif ADIOI_Free(datarep); datarep = datarep_next; } diff --git a/ompi/mca/io/romio/romio/adio/common/ad_fcntl.c b/ompi/mca/io/romio/romio/adio/common/ad_fcntl.c index f526c71d76..62067573dd 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_fcntl.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_fcntl.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2005 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/common/ad_features.c b/ompi/mca/io/romio/romio/adio/common/ad_features.c index a62be219a2..339c54d52b 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_features.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_features.c @@ -7,6 +7,7 @@ int ADIOI_GEN_Feature(ADIO_File fd, int flag) case ADIO_SHARED_FP: case ADIO_ATOMIC_MODE: case ADIO_DATA_SIEVING_WRITES: + case ADIO_UNLINK_AFTER_CLOSE: return 1; break; case ADIO_SCALABLE_OPEN: diff --git a/ompi/mca/io/romio/romio/adio/common/ad_flush.c b/ompi/mca/io/romio/romio/adio/common/ad_flush.c index 8494d37522..61a9ed40a2 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_flush.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_flush.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/common/ad_fstype.c b/ompi/mca/io/romio/romio/adio/common/ad_fstype.c index b350effb85..67266cdb58 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_fstype.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_fstype.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. @@ -106,12 +106,12 @@ defined(ROMIO_HAVE_STRUCT_STAT_WITH_ST_FSTYPE) #ifndef ROMIO_NTFS #define ROMIO_NEEDS_ADIOPARENTDIR -static void ADIO_FileSysType_parentdir(char *filename, char **dirnamep); +static void ADIO_FileSysType_parentdir(const char *filename, char **dirnamep); #endif #endif -static void ADIO_FileSysType_prefix(char *filename, int *fstype, +static void ADIO_FileSysType_prefix(const char *filename, int *fstype, int *error_code); -static void ADIO_FileSysType_fncall(char *filename, int *fstype, +static void ADIO_FileSysType_fncall(const char *filename, int *fstype, int *error_code); /* @@ -152,7 +152,7 @@ Output Parameters: * Returns pointer to string in dirnamep; that string is allocated with * strdup and must be free()'d. */ -static void ADIO_FileSysType_parentdir(char *filename, char **dirnamep) +static void ADIO_FileSysType_parentdir(const char *filename, char **dirnamep) { int err; char *dir = NULL, *slash; @@ -204,15 +204,23 @@ static void ADIO_FileSysType_parentdir(char *filename, char **dirnamep) } #endif /* ROMIO_NTFS */ -#ifdef ROMIO_BGL /* BlueGene support for pvfs through ufs */ +#ifdef ROMIO_BGL /* BlueGene support for lockless i/o (necessary for PVFS. + possibly beneficial for others, unless data sieving + writes desired) */ + +/* BlueGene environment variables can override lockless selection.*/ +extern void ad_bgl_get_env_vars(); +extern long bglocklessmpio_f_type; + static void check_for_lockless_exceptions(long stat_type, int *fstype) { - /* exception for lockless PVFS file system. PVFS is the only exception we - * make right now, but any future FS developers looking to override - * BlueGene fs detection can do it here */ - if (stat_type == PVFS2_SUPER_MAGIC) - /* use lock-free driver on bluegene to support pvfs */ - *fstype = ADIO_BGLOCKLESS; + /* exception for lockless file systems. (PVFS2 is the default in ad_bgl_tuning.) + * The BGLOCKLESS_F_TYPE environment variable will override it by specifying + * the appropriate file system magic number here. + */ + if (stat_type == bglocklessmpio_f_type) + /* use lock-free driver on bluegene to support specified fs (defaults to pvfs2) */ + *fstype = ADIO_BGLOCKLESS; } #endif /* @@ -232,10 +240,9 @@ Output Parameters: file system type. Most other functions use the type which is stored when the file is opened. */ -static void ADIO_FileSysType_fncall(char *filename, int *fstype, int *error_code) +static void ADIO_FileSysType_fncall(const char *filename, int *fstype, int *error_code) { -#ifndef ROMIO_NTFS - char *dir; +#if defined (ROMIO_HAVE_STRUCT_STATVFS_WITH_F_BASETYPE) || defined (HAVE_STRUCT_STATFS) || defined (ROMIO_HAVE_STRUCT_STAT_WITH_ST_FSTYPE) int err; #endif @@ -257,17 +264,24 @@ static void ADIO_FileSysType_fncall(char *filename, int *fstype, int *error_code err = statvfs(filename, &vfsbuf); } while (err && (errno == ESTALE)); - if (err && (errno == ENOENT)) { + if (err) { /* ENOENT may be returned in two cases: * 1) no directory entry for "filename" * 2) "filename" is a dangling symbolic link * * ADIO_FileSysType_parentdir tries to deal with both cases. */ - ADIO_FileSysType_parentdir(filename, &dir); - err = statvfs(dir, &vfsbuf); + if (errno == ENOENT) { + char *dir; + ADIO_FileSysType_parentdir(filename, &dir); + err = statvfs(dir, &vfsbuf); - ADIOI_Free(dir); + ADIOI_Free(dir); + } + else { + *error_code = ADIOI_Err_create_code(myname, filename, errno); + if(*error_code != MPI_SUCCESS) return; + } } /* --BEGIN ERROR HANDLING-- */ @@ -307,10 +321,17 @@ static void ADIO_FileSysType_fncall(char *filename, int *fstype, int *error_code err = statfs(filename, &fsbuf); } while (err && (errno == ESTALE)); - if (err && (errno == ENOENT)) { - ADIO_FileSysType_parentdir(filename, &dir); - err = statfs(dir, &fsbuf); - ADIOI_Free(dir); + if (err) { + if(errno == ENOENT) { + char *dir; + ADIO_FileSysType_parentdir(filename, &dir); + err = statfs(dir, &fsbuf); + ADIOI_Free(dir); + } + else { + *error_code = ADIOI_Err_create_code(myname, filename, errno); + if(*error_code != MPI_SUCCESS) return; + } } /* --BEGIN ERROR HANDLING-- */ @@ -332,6 +353,10 @@ static void ADIO_FileSysType_fncall(char *filename, int *fstype, int *error_code # ifdef ROMIO_BGL /* BlueGene is a special case: all file systems are AD_BGL, except for * certain exceptions */ + + /* Bluegene needs to read enviroment variables before selecting the file system*/ + ad_bgl_get_env_vars(); + *fstype = ADIO_BGL; check_for_lockless_exceptions(fsbuf.f_type, fstype); *error_code = MPI_SUCCESS; @@ -415,10 +440,17 @@ static void ADIO_FileSysType_fncall(char *filename, int *fstype, int *error_code err = stat(filename, &sbuf); } while (err && (errno == ESTALE)); - if (err && (errno == ENOENT)) { - ADIO_FileSysType_parentdir(filename, &dir); - err = stat(dir, &sbuf); - ADIOI_Free(dir); + if (err) { + if(errno == ENOENT) { + char *dir; + ADIO_FileSysType_parentdir(filename, &dir); + err = stat(dir, &sbuf); + ADIOI_Free(dir); + } + else{ + *error_code = ADIOI_Err_create_code(myname, filename, errno); + if(*error_code != MPI_SUCCESS) return; + } } if (err) { @@ -456,7 +488,7 @@ static void ADIO_FileSysType_fncall(char *filename, int *fstype, int *error_code * stat system calls (unless a fs prefix is given). Cary out this file system * detection in a more scalable way by having rank 0 stat the file and broadcast the result (fs type and error code) to the other mpi processes */ -static void ADIO_FileSysType_fncall_scalable(MPI_Comm comm, char *filename, int * file_system, int * error_code) +static void ADIO_FileSysType_fncall_scalable(MPI_Comm comm, const char *filename, int * file_system, int * error_code) { int rank; int buf[2]; @@ -490,7 +522,7 @@ Output Parameters: is considered an error. Except for on Windows systems where the default is NTFS. */ -static void ADIO_FileSysType_prefix(char *filename, int *fstype, int *error_code) +static void ADIO_FileSysType_prefix(const char *filename, int *fstype, int *error_code) { static char myname[] = "ADIO_RESOLVEFILETYPE_PREFIX"; *error_code = MPI_SUCCESS; @@ -584,7 +616,7 @@ order to clean things up. The goal is to separate all this "did we compile for this fs type" code from the MPI layer and also to introduce the ADIOI_Fns tables in a reasonable way. -- Rob, 06/06/2001 @*/ -void ADIO_ResolveFileType(MPI_Comm comm, char *filename, int *fstype, +void ADIO_ResolveFileType(MPI_Comm comm, const char *filename, int *fstype, ADIOI_Fns **ops, int *error_code) { int myerrcode, file_system, min_code, max_code; @@ -603,6 +635,8 @@ void ADIO_ResolveFileType(MPI_Comm comm, char *filename, int *fstype, * everyone else. * - Note that we will not catch cases like * http://www.mcs.anl.gov/web-mail-archive/lists/mpich-discuss/2007/08/msg00042.html + * (edit: now http://lists.mcs.anl.gov/pipermail/mpich-discuss/2007-August/002648.html) + * * where file systems are not mounted or available on other processes, * but we'll catch those a few functions later in ADIO_Open * - Note that if we have NFS enabled, we might have a situation where, @@ -632,7 +666,9 @@ void ADIO_ResolveFileType(MPI_Comm comm, char *filename, int *fstype, * system type check below. This case could happen if a full * path exists on one node but not on others, and no prefix * like ufs: was provided. see discussion at - * http://www.mcs.anl.gov/web-mail-archive/lists/mpich-discuss/2007/08/msg00042.html + * http://www.mcs.anl.gov/web-mail-archive/lists/mpich-discuss/2007/08/msg00042.html + * (edit: now + * http://lists.mcs.anl.gov/pipermail/mpich-discuss/2007-August/002648.html) */ MPI_Allreduce(error_code, &max_code, 1, MPI_INT, MPI_MAX, comm); diff --git a/ompi/mca/io/romio/romio/adio/common/ad_get_sh_fp.c b/ompi/mca/io/romio/romio/adio/common/ad_get_sh_fp.c index 6e2ba6f9a3..2a6bc5b8cd 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_get_sh_fp.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_get_sh_fp.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. @@ -6,6 +6,13 @@ #include "adio.h" +#ifdef ROMIO_BGL +void ADIOI_BGL_Get_shared_fp(ADIO_File fd, int size, ADIO_Offset *shared_fp, int *error_code); +#endif +#ifdef ROMIO_BG +void ADIOI_BG_Get_shared_fp(ADIO_File fd, int size, ADIO_Offset *shared_fp, int *error_code); +#endif + /* returns the current location of the shared_fp in terms of the no. of etypes relative to the current view, and also increments the shared_fp by the number of etypes to be accessed (incr) in the read @@ -65,9 +72,12 @@ void ADIO_Get_shared_fp(ADIO_File fd, int incr, ADIO_Offset *shared_fp, } } + if (incr == 0) {goto done;} + new_fp = *shared_fp + incr; ADIO_WriteContig(fd->shared_fp_fd, &new_fp, sizeof(ADIO_Offset), MPI_BYTE, ADIO_EXPLICIT_OFFSET, 0, &status, error_code); +done: ADIOI_UNLOCK(fd->shared_fp_fd, 0, SEEK_SET, sizeof(ADIO_Offset)); } diff --git a/ompi/mca/io/romio/romio/adio/common/ad_hints.c b/ompi/mca/io/romio/romio/adio/common/ad_hints.c index cd755d4a7f..a7a6f6d7e0 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_hints.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_hints.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -40,7 +40,13 @@ void ADIOI_GEN_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code) value = (char *) ADIOI_Malloc((MPI_MAX_INFO_VAL+1)*sizeof(char)); if (value == NULL) { - /* NEED TO HANDLE ENOMEM */ + *error_code = MPIO_Err_create_code(*error_code, + MPIR_ERR_RECOVERABLE, + myname, + __LINE__, + MPI_ERR_OTHER, + "**nomem2",0); + return; } /* initialize info and hints to default values if they haven't been @@ -484,7 +490,13 @@ void ADIOI_GEN_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code) len = (strlen(value)+1) * sizeof(char); fd->hints->cb_config_list = ADIOI_Malloc(len); if (fd->hints->cb_config_list == NULL) { - /* NEED TO HANDLE ENOMEM */ + *error_code = MPIO_Err_create_code(*error_code, + MPIR_ERR_RECOVERABLE, + myname, + __LINE__, + MPI_ERR_OTHER, + "**nomem2",0); + return; } ADIOI_Strncpy(fd->hints->cb_config_list, value, len); } @@ -517,7 +529,13 @@ void ADIOI_GEN_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code) len = (strlen(ADIOI_CB_CONFIG_LIST_DFLT)+1) * sizeof(char); fd->hints->cb_config_list = ADIOI_Malloc(len); if (fd->hints->cb_config_list == NULL) { - /* NEED TO HANDLE ENOMEM */ + *error_code = MPIO_Err_create_code(*error_code, + MPIR_ERR_RECOVERABLE, + myname, + __LINE__, + MPI_ERR_OTHER, + "**nomem2",0); + return; } ADIOI_Strncpy(fd->hints->cb_config_list, ADIOI_CB_CONFIG_LIST_DFLT, len); } diff --git a/ompi/mca/io/romio/romio/adio/common/ad_init.c b/ompi/mca/io/romio/romio/adio/common/ad_init.c index 7ec0dac615..ad24f0eb62 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_init.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_init.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -97,6 +97,8 @@ void ADIO_Init(int *argc, char ***argv, int *error_code) MPE_Log_get_state_eventIDs( &ADIOI_MPE_openinternal_a, &ADIOI_MPE_openinternal_b); MPE_Log_get_state_eventIDs( &ADIOI_MPE_stat_a, &ADIOI_MPE_stat_b); + MPE_Log_get_state_eventIDs( &ADIOI_MPE_iread_a, &ADIOI_MPE_iread_b); + MPE_Log_get_state_eventIDs( &ADIOI_MPE_iwrite_a, &ADIOI_MPE_iwrite_b); int comm_world_rank; MPI_Comm_rank( MPI_COMM_WORLD, &comm_world_rank ); @@ -122,6 +124,8 @@ void ADIO_Init(int *argc, char ***argv, int *error_code) "postwrite", "ivory" ); MPE_Describe_state( ADIOI_MPE_openinternal_a, ADIOI_MPE_openinternal_b, "open system", "blue"); MPE_Describe_state( ADIOI_MPE_stat_a, ADIOI_MPE_stat_b, "stat", "purple"); + MPE_Describe_state( ADIOI_MPE_iread_a, ADIOI_MPE_iread_b, "iread", "purple"); + MPE_Describe_state( ADIOI_MPE_iwrite_a, ADIOI_MPE_iwrite_b, "iwrite", "purple"); } } #endif diff --git a/ompi/mca/io/romio/romio/adio/common/ad_io_coll.c b/ompi/mca/io/romio/romio/adio/common/ad_io_coll.c index 6c2c275645..198ba62c6a 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_io_coll.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_io_coll.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 2008 University of Chicago. * See COPYRIGHT notice in top-level directory. @@ -50,11 +50,14 @@ void ADIOI_IOStridedColl (ADIO_File fd, void *buf, int count, int rdwr, ADIO_Offset st_end_offset[2]; ADIO_Offset *all_st_end_offsets = NULL; int filetype_is_contig, buftype_is_contig, is_contig; - ADIO_Offset orig_fp, off; + ADIO_Offset off; int interleave_count = 0, i, nprocs, myrank, nprocs_for_coll; int cb_enable; ADIO_Offset bufsize; - MPI_Aint extent, bufextent; + MPI_Aint extent; +#ifdef DEBUG2 + MPI_Aint bufextent; +#endif int size; int agg_rank; @@ -110,7 +113,6 @@ void ADIOI_IOStridedColl (ADIO_File fd, void *buf, int count, int rdwr, completing. */ nprocs_for_coll = fd->hints->cb_nodes; - orig_fp = fd->fp_ind; if (rdwr == ADIOI_READ) cb_enable = fd->hints->cb_read; @@ -190,7 +192,9 @@ void ADIOI_IOStridedColl (ADIO_File fd, void *buf, int count, int rdwr, } MPI_Type_extent(datatype, &extent); +#ifdef DEBUG2 bufextent = extent * count; +#endif MPI_Type_size(datatype, &size); bufsize = size * count; diff --git a/ompi/mca/io/romio/romio/adio/common/ad_iopen.c b/ompi/mca/io/romio/romio/adio/common/ad_iopen.c index add0121604..b678541bd9 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_iopen.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_iopen.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2002 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/common/ad_iread.c b/ompi/mca/io/romio/romio/adio/common/ad_iread.c index 2a38295348..864393a6db 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_iread.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_iread.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2004 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/common/ad_iread_fake.c b/ompi/mca/io/romio/romio/adio/common/ad_iread_fake.c index c6a2562bd8..d6ae07ef6a 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_iread_fake.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_iread_fake.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2004 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/common/ad_iwrite.c b/ompi/mca/io/romio/romio/adio/common/ad_iwrite.c index 5a18198fb1..d95f8fcef2 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_iwrite.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_iwrite.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2004 University of Chicago. @@ -44,10 +44,10 @@ static MPIX_Grequest_class ADIOI_GEN_greq_class = 0; * routines. Otherwise, the ADIOI_Fns_struct will point to the FAKE * version. */ -void ADIOI_GEN_IwriteContig(ADIO_File fd, void *buf, int count, +void ADIOI_GEN_IwriteContig(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Request *request, - int *error_code) + int *error_code) { int len, typesize; int aio_errno = 0; @@ -58,7 +58,9 @@ void ADIOI_GEN_IwriteContig(ADIO_File fd, void *buf, int count, ADIOI_Assert(len == (int)((ADIO_Offset)count * (ADIO_Offset)typesize)); /* the count is an int parm */ if (file_ptr_type == ADIO_INDIVIDUAL) offset = fd->fp_ind; - aio_errno = ADIOI_GEN_aio(fd, buf, len, offset, 1, request); + /* Cast away the const'ness of 'buf' as ADIOI_GEN_aio is used for + * both read and write calls */ + aio_errno = ADIOI_GEN_aio(fd, (char *) buf, len, offset, 1, request); if (file_ptr_type == ADIO_INDIVIDUAL) fd->fp_ind += len; fd->fp_sys_posn = -1; @@ -177,7 +179,7 @@ int ADIOI_GEN_aio(ADIO_File fd, void *buf, int len, ADIO_Offset offset, /* Generic implementation of IwriteStrided calls the blocking WriteStrided * immediately. */ -void ADIOI_GEN_IwriteStrided(ADIO_File fd, void *buf, int count, +void ADIOI_GEN_IwriteStrided(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, MPI_Request *request, int *error_code) diff --git a/ompi/mca/io/romio/romio/adio/common/ad_iwrite_fake.c b/ompi/mca/io/romio/romio/adio/common/ad_iwrite_fake.c index 1df7d9d436..9f40627af4 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_iwrite_fake.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_iwrite_fake.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2004 University of Chicago. @@ -12,10 +12,10 @@ /* Generic implementation of IwriteContig calls the blocking WriteContig * immediately. */ -void ADIOI_FAKE_IwriteContig(ADIO_File fd, void *buf, int count, +void ADIOI_FAKE_IwriteContig(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Request *request, - int *error_code) + int *error_code) { ADIO_Status status; MPI_Offset len; @@ -43,8 +43,8 @@ void ADIOI_FAKE_IwriteContig(ADIO_File fd, void *buf, int count, /* Generic implementation of IwriteStrided calls the blocking WriteStrided * immediately. */ -void ADIOI_FAKE_IwriteStrided(ADIO_File fd, void *buf, int count, - MPI_Datatype datatype, int file_ptr_type, +void ADIOI_FAKE_IwriteStrided(ADIO_File fd, const void *buf, int count, + MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Request *request, int *error_code) { diff --git a/ompi/mca/io/romio/romio/adio/common/ad_open.c b/ompi/mca/io/romio/romio/adio/common/ad_open.c index 20a9eadd1c..cfd1e7a879 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_open.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_open.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -19,7 +19,7 @@ static int build_cb_config_list(ADIO_File fd, int rank, int procs, int *error_code); MPI_File ADIO_Open(MPI_Comm orig_comm, - MPI_Comm comm, char *filename, int file_system, + MPI_Comm comm, const char *filename, int file_system, ADIOI_Fns *ops, int access_mode, ADIO_Offset disp, MPI_Datatype etype, MPI_Datatype filetype, @@ -75,7 +75,13 @@ MPI_File ADIO_Open(MPI_Comm orig_comm, /* create and initialize info object */ fd->hints = (ADIOI_Hints *)ADIOI_Calloc(1, sizeof(struct ADIOI_Hints_struct)); if (fd->hints == NULL) { - /* NEED TO HANDLE ENOMEM ERRORS */ + *error_code = MPIO_Err_create_code(*error_code, + MPIR_ERR_RECOVERABLE, + myname, + __LINE__, + MPI_ERR_OTHER, + "**nomem2",0); + goto fn_exit; } fd->hints->cb_config_list = NULL; fd->hints->ranklist = NULL; @@ -254,7 +260,13 @@ static int build_cb_config_list(ADIO_File fd, if (rank == 0) { tmp_ranklist = (int *) ADIOI_Malloc(sizeof(int) * procs); if (tmp_ranklist == NULL) { - /* NEED TO HANDLE ENOMEM ERRORS */ + *error_code = MPIO_Err_create_code(*error_code, + MPIR_ERR_RECOVERABLE, + myname, + __LINE__, + MPI_ERR_OTHER, + "**nomem2",0); + return 0; } rank_ct = ADIOI_cb_config_list_parse(fd->hints->cb_config_list, diff --git a/ompi/mca/io/romio/romio/adio/common/ad_opencoll.c b/ompi/mca/io/romio/romio/adio/common/ad_opencoll.c index 243fe84b84..235bd780b3 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_opencoll.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_opencoll.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2007 UChicago/Argonne LLC diff --git a/ompi/mca/io/romio/romio/adio/common/ad_opencoll_failsafe.c b/ompi/mca/io/romio/romio/adio/common/ad_opencoll_failsafe.c index 4dcdfc729d..78954d9350 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_opencoll_failsafe.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_opencoll_failsafe.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2007 UChicago/Argonne LLC @@ -74,6 +74,7 @@ void ADIOI_FAILSAFE_OpenColl(ADIO_File fd, int rank, if (*error_code != MPI_SUCCESS) (*(fd->fns->ADIOI_xxx_Open))(fd, error_code); + if(*error_code != MPI_SUCCESS) return; /* if we turned off EXCL earlier, then we should turn it back on */ if (fd->access_mode != orig_amode_excl) fd->access_mode = orig_amode_excl; diff --git a/ompi/mca/io/romio/romio/adio/common/ad_opencoll_scalable.c b/ompi/mca/io/romio/romio/adio/common/ad_opencoll_scalable.c index eee8520c6d..1a68ac0515 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_opencoll_scalable.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_opencoll_scalable.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2007 UChicago/Argonne LLC diff --git a/ompi/mca/io/romio/romio/adio/common/ad_prealloc.c b/ompi/mca/io/romio/romio/adio/common/ad_prealloc.c index cd18dbb283..0cc8d2bbf9 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_prealloc.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_prealloc.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2004 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/common/ad_read.c b/ompi/mca/io/romio/romio/adio/common/ad_read.c index f5549fc63d..0c706f8ae9 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_read.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_read.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/common/ad_read_coll.c b/ompi/mca/io/romio/romio/adio/common/ad_read_coll.c index ddbcd9157d..ec849aca28 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_read_coll.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_read_coll.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/common/ad_read_str.c b/ompi/mca/io/romio/romio/adio/common/ad_read_str.c index 61d3c73abe..1491e96220 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_read_str.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_read_str.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -87,6 +87,9 @@ void ADIOI_GEN_ReadStrided(ADIO_File fd, void *buf, int count, MPI_Type_size(fd->filetype, &filetype_size); if ( ! filetype_size ) { +#ifdef HAVE_STATUS_SET_BYTES + MPIR_Status_set_bytes(status, datatype, 0); +#endif *error_code = MPI_SUCCESS; return; } diff --git a/ompi/mca/io/romio/romio/adio/common/ad_read_str_naive.c b/ompi/mca/io/romio/romio/adio/common/ad_read_str_naive.c index e2d74c4064..95c14b41bb 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_read_str_naive.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_read_str_naive.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. @@ -36,6 +36,9 @@ void ADIOI_GEN_ReadStrided_naive(ADIO_File fd, void *buf, int count, MPI_Type_size(fd->filetype, (int*)&filetype_size); if ( ! filetype_size ) { +#ifdef HAVE_STATUS_SET_BYTES + MPIR_Status_set_bytes(status, buftype, 0); +#endif *error_code = MPI_SUCCESS; return; } diff --git a/ompi/mca/io/romio/romio/adio/common/ad_resize.c b/ompi/mca/io/romio/romio/adio/common/ad_resize.c index bf38296c58..a6be2c1760 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_resize.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_resize.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2004 University of Chicago. @@ -29,9 +29,7 @@ void ADIOI_GEN_Resize(ADIO_File fd, ADIO_Offset size, int *error_code) /* --BEGIN ERROR HANDLING-- */ if (err == -1) { - *error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, - myname, __LINE__, MPI_ERR_IO, - "**io", "**io %s", strerror(errno)); + *error_code = ADIOI_Err_create_code(myname, fd->filename, errno); return; } /* --END ERROR HANDLING-- */ diff --git a/ompi/mca/io/romio/romio/adio/common/ad_seek.c b/ompi/mca/io/romio/romio/adio/common/ad_seek.c index 2fc19c54f4..380649b3f0 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_seek.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_seek.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. diff --git a/ompi/mca/io/romio/romio/adio/common/ad_set_sh_fp.c b/ompi/mca/io/romio/romio/adio/common/ad_set_sh_fp.c index 8e87912fc9..2787b3ec0f 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_set_sh_fp.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_set_sh_fp.c @@ -1,10 +1,13 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. */ #include "adio.h" +#ifdef ROMIO_BG +void ADIOI_BG_Set_shared_fp(ADIO_File fd, ADIO_Offset offset, int *error_code); +#endif /* set the shared file pointer to "offset" etypes relative to the current view */ diff --git a/ompi/mca/io/romio/romio/adio/common/ad_set_view.c b/ompi/mca/io/romio/romio/adio/common/ad_set_view.c index 1358cb669b..71ed7b73d2 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_set_view.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_set_view.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/common/ad_subarray.c b/ompi/mca/io/romio/romio/adio/common/ad_subarray.c index f9a32e3c02..c4597646ad 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_subarray.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_subarray.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/common/ad_wait.c b/ompi/mca/io/romio/romio/adio/common/ad_wait.c index f2a65d1e1f..2112ee8fb6 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_wait.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_wait.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2004 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/common/ad_wait_fake.c b/ompi/mca/io/romio/romio/adio/common/ad_wait_fake.c index f0be5ecbf7..16947baa1f 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_wait_fake.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_wait_fake.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2004 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/common/ad_write.c b/ompi/mca/io/romio/romio/adio/common/ad_write.c index 3c1eefb09a..d9ccabf375 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_write.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_write.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2004 University of Chicago. @@ -14,7 +14,7 @@ #include "mpe.h" #endif -void ADIOI_GEN_WriteContig(ADIO_File fd, void *buf, int count, +void ADIOI_GEN_WriteContig(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code) diff --git a/ompi/mca/io/romio/romio/adio/common/ad_write_coll.c b/ompi/mca/io/romio/romio/adio/common/ad_write_coll.c index c547b2a367..e5ed05c65e 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_write_coll.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_write_coll.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -51,7 +51,7 @@ void ADIOI_Heap_merge(ADIOI_Access *others_req, int *count, int nprocs, int nprocs_recv, int total_elements); -void ADIOI_GEN_WriteStridedColl(ADIO_File fd, void *buf, int count, +void ADIOI_GEN_WriteStridedColl(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code) @@ -81,7 +81,9 @@ void ADIOI_GEN_WriteStridedColl(ADIO_File fd, void *buf, int count, int old_error, tmp_error; if (fd->hints->cb_pfr != ADIOI_HINT_DISABLE) { - ADIOI_IOStridedColl (fd, buf, count, ADIOI_WRITE, datatype, + /* Cast away const'ness as the below function is used for read + * and write */ + ADIOI_IOStridedColl (fd, (char *) buf, count, ADIOI_WRITE, datatype, file_ptr_type, offset, status, error_code); return; } @@ -202,7 +204,8 @@ void ADIOI_GEN_WriteStridedColl(ADIO_File fd, void *buf, int count, ADIOI_Free(my_req); /* exchange data and write in sizes of no more than coll_bufsize. */ - ADIOI_Exch_and_write(fd, buf, datatype, nprocs, myrank, + /* Cast away const'ness for the below function */ + ADIOI_Exch_and_write(fd, (char *) buf, datatype, nprocs, myrank, others_req, offset_list, len_list, contig_access_count, min_st_offset, fd_size, fd_start, fd_end, buf_idx, error_code); @@ -580,8 +583,8 @@ static void ADIOI_W_Exchange_data(ADIO_File fd, void *buf, char *write_buf, MPI_Request *requests, *send_req; MPI_Datatype *recv_types; MPI_Status *statuses, status; - int *srt_len, sum; - ADIO_Offset *srt_off; + int *srt_len=NULL, sum; + ADIO_Offset *srt_off=NULL; static char myname[] = "ADIOI_W_EXCHANGE_DATA"; /* exchange recv_size info so that each process knows how much to @@ -624,12 +627,15 @@ static void ADIOI_W_Exchange_data(ADIO_File fd, void *buf, char *write_buf, sum = 0; for (i=0; i srt_len[0]) srt_len[0] = new_len; - } - else - break; - } - if (i < sum || size != srt_len[0]) /* hole in middle or end */ + if (sum) { + if (off != srt_off[0]) /* hole at the front */ *hole = 1; - } + else { /* coalesce the sorted offset-length pairs */ + for (i=1; i srt_len[0]) srt_len[0] = new_len; + } + else + break; + } + if (i < sum || size != srt_len[0]) /* hole in middle or end */ + *hole = 1; + } - ADIOI_Free(srt_off); - ADIOI_Free(srt_len); + ADIOI_Free(srt_off); + ADIOI_Free(srt_len); + } if (nprocs_recv) { if (*hole) { diff --git a/ompi/mca/io/romio/romio/adio/common/ad_write_nolock.c b/ompi/mca/io/romio/romio/adio/common/ad_write_nolock.c index 091b8ec42b..56a84d4a23 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_write_nolock.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_write_nolock.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -12,7 +12,7 @@ /* #define IO_DEBUG 1 */ -void ADIOI_NOLOCK_WriteStrided(ADIO_File fd, void *buf, int count, +void ADIOI_NOLOCK_WriteStrided(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code) @@ -58,6 +58,9 @@ void ADIOI_NOLOCK_WriteStrided(ADIO_File fd, void *buf, int count, MPI_Type_size(fd->filetype, &filetype_size); if ( ! filetype_size ) { +#ifdef HAVE_STATUS_SET_BYTES + MPIR_Status_set_bytes(status, datatype, 0); +#endif *error_code = MPI_SUCCESS; return; } diff --git a/ompi/mca/io/romio/romio/adio/common/ad_write_str.c b/ompi/mca/io/romio/romio/adio/common/ad_write_str.c index b13fb183c0..5acc300700 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_write_str.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_write_str.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -108,7 +108,7 @@ memcpy(writebuf, (char *)buf + userbuf_off, write_sz);\ } \ } -void ADIOI_GEN_WriteStrided(ADIO_File fd, void *buf, int count, +void ADIOI_GEN_WriteStrided(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code) @@ -157,6 +157,9 @@ void ADIOI_GEN_WriteStrided(ADIO_File fd, void *buf, int count, MPI_Type_size(fd->filetype, &filetype_size); if ( ! filetype_size ) { +#ifdef HAVE_STATUS_SET_BYTES + MPIR_Status_set_bytes(status, datatype, 0); +#endif *error_code = MPI_SUCCESS; return; } diff --git a/ompi/mca/io/romio/romio/adio/common/ad_write_str_naive.c b/ompi/mca/io/romio/romio/adio/common/ad_write_str_naive.c index 6cd859e952..4fb4b35c82 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_write_str_naive.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_write_str_naive.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. @@ -8,7 +8,7 @@ #include "adio.h" #include "adio_extern.h" -void ADIOI_GEN_WriteStrided_naive(ADIO_File fd, void *buf, int count, +void ADIOI_GEN_WriteStrided_naive(ADIO_File fd, const void *buf, int count, MPI_Datatype buftype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code) @@ -37,6 +37,9 @@ void ADIOI_GEN_WriteStrided_naive(ADIO_File fd, void *buf, int count, MPI_Type_size(fd->filetype, &filetype_size); if ( ! filetype_size ) { +#ifdef HAVE_STATUS_SET_BYTES + MPIR_Status_set_bytes(status, buftype, 0); +#endif *error_code = MPI_SUCCESS; return; } diff --git a/ompi/mca/io/romio/romio/adio/common/adi_close.c b/ompi/mca/io/romio/romio/adio/common/adi_close.c index ce82d31652..cdc1873785 100644 --- a/ompi/mca/io/romio/romio/adio/common/adi_close.c +++ b/ompi/mca/io/romio/romio/adio/common/adi_close.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -39,10 +39,7 @@ void ADIOI_GEN_Close(ADIO_File fd, int *error_code) fd->fd_direct = -1; if (err == -1 || derr == -1) { - *error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, - myname, __LINE__, MPI_ERR_IO, - "**io", - "**io %s", strerror(errno)); + *error_code = ADIOI_Err_create_code(myname, fd->filename, errno); } else *error_code = MPI_SUCCESS; } diff --git a/ompi/mca/io/romio/romio/adio/common/async_list.c b/ompi/mca/io/romio/romio/adio/common/async_list.c index cd4c48d0c3..239dbe587b 100644 --- a/ompi/mca/io/romio/romio/adio/common/async_list.c +++ b/ompi/mca/io/romio/romio/adio/common/async_list.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/common/byte_offset.c b/ompi/mca/io/romio/romio/adio/common/byte_offset.c index ce88cf1893..df16e2e540 100644 --- a/ompi/mca/io/romio/romio/adio/common/byte_offset.c +++ b/ompi/mca/io/romio/romio/adio/common/byte_offset.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/common/cb_config_list.c b/ompi/mca/io/romio/romio/adio/common/cb_config_list.c index bb2c1eeff9..9f629337f2 100644 --- a/ompi/mca/io/romio/romio/adio/common/cb_config_list.c +++ b/ompi/mca/io/romio/romio/adio/common/cb_config_list.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. @@ -66,6 +66,8 @@ int ADIOI_cb_bcast_rank_map(ADIO_File fd) { int my_rank; char *value; + int error_code = MPI_SUCCESS; + static char myname[] = "ADIOI_cb_bcast_rank_map"; MPI_Bcast(&(fd->hints->cb_nodes), 1, MPI_INT, 0, fd->comm); if (fd->hints->cb_nodes > 0) { @@ -73,7 +75,13 @@ int ADIOI_cb_bcast_rank_map(ADIO_File fd) if (my_rank != 0) { fd->hints->ranklist = ADIOI_Malloc(fd->hints->cb_nodes*sizeof(int)); if (fd->hints->ranklist == NULL) { - /* NEED TO HANDLE ENOMEM */ + error_code = MPIO_Err_create_code(error_code, + MPIR_ERR_RECOVERABLE, + myname, + __LINE__, + MPI_ERR_OTHER, + "**nomem2",0); + return error_code; } } MPI_Bcast(fd->hints->ranklist, fd->hints->cb_nodes, MPI_INT, 0, @@ -119,7 +127,7 @@ int ADIOI_cb_gather_name_array(MPI_Comm comm, } else { MPI_Attr_get(comm, ADIOI_cb_config_list_keyval, (void *) &array, &found); - if (found) { + if (found) { ADIOI_Assert(array != NULL); *arrayp = array; return 0; diff --git a/ompi/mca/io/romio/romio/adio/common/eof_offset.c b/ompi/mca/io/romio/romio/adio/common/eof_offset.c index 981efa087a..1b2c9aefba 100644 --- a/ompi/mca/io/romio/romio/adio/common/eof_offset.c +++ b/ompi/mca/io/romio/romio/adio/common/eof_offset.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/common/error.c b/ompi/mca/io/romio/romio/adio/common/error.c index 6dc8e49399..15f2376f35 100644 --- a/ompi/mca/io/romio/romio/adio/common/error.c +++ b/ompi/mca/io/romio/romio/adio/common/error.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -36,3 +36,66 @@ int ADIOI_Error(ADIO_File fd, int error_code, char *string) return error_code; } +/* Returns an MPI error code corresponding to "my_errno", for function "myname" + * and the given file, "filename". */ +int ADIOI_Err_create_code(const char *myname, const char *filename, int my_errno) +{ + int error_code = MPI_SUCCESS; + if(!my_errno) return MPI_SUCCESS; + + switch(my_errno) { + case EACCES: + error_code = MPIO_Err_create_code(MPI_SUCCESS, + MPIR_ERR_RECOVERABLE, myname, + __LINE__, MPI_ERR_ACCESS, + "**fileaccess", + "**fileaccess %s", + filename ); + break; + case ENAMETOOLONG: + error_code = MPIO_Err_create_code(MPI_SUCCESS, + MPIR_ERR_RECOVERABLE, myname, + __LINE__, MPI_ERR_BAD_FILE, + "**filenamelong", + "**filenamelong %s %d", + filename, + strlen(filename)); + break; + case ENOENT: + error_code = MPIO_Err_create_code(MPI_SUCCESS, + MPIR_ERR_RECOVERABLE, myname, + __LINE__, MPI_ERR_NO_SUCH_FILE, + "**filenoexist", + "**filenoexist %s", + filename); + break; + case EISDIR: + error_code = MPIO_Err_create_code(MPI_SUCCESS, + MPIR_ERR_RECOVERABLE, + myname, __LINE__, + MPI_ERR_BAD_FILE, + "**filenamedir", + "**filenamedir %s", + filename); + break; + case EROFS: + error_code = MPIO_Err_create_code(MPI_SUCCESS, + MPIR_ERR_RECOVERABLE, myname, + __LINE__, MPI_ERR_READ_ONLY, + "**ioneedrd", 0 ); + break; + case EEXIST: + error_code = MPIO_Err_create_code(MPI_SUCCESS, + MPIR_ERR_RECOVERABLE, myname, + __LINE__, MPI_ERR_FILE_EXISTS, + "**fileexist", 0); + break; + default: + error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, + myname, __LINE__, MPI_ERR_IO, "**io", + "**io %s", strerror(my_errno)); + break; + } + + return error_code; +} diff --git a/ompi/mca/io/romio/romio/adio/common/flatten.c b/ompi/mca/io/romio/romio/adio/common/flatten.c index 06a456cc41..6ed7f06678 100644 --- a/ompi/mca/io/romio/romio/adio/common/flatten.c +++ b/ompi/mca/io/romio/romio/adio/common/flatten.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. @@ -9,9 +9,6 @@ /* #ifdef MPISGI #include "mpisgi2.h" #endif */ -#ifdef ROMIO_INSIDE_MPICH2 -#include "mpid_datatype.h" -#endif #ifdef USE_DBG_LOGGING #define FLATTEN_DEBUG 1 @@ -27,9 +24,6 @@ void ADIOI_Flatten_datatype(MPI_Datatype datatype) int curr_index=0, is_contig; ADIOI_Flatlist_node *flat, *prev=0; -#ifdef ROMIO_INSIDE_MPICH2 - if(MPIU_DBG_SELECTED(DATATYPE,TYPICAL)) MPIDU_Datatype_debug(datatype, 4); /* use -env MPICH_DBG_OUTPUT=stdout */ -#endif /* check if necessary to flatten. */ /* is it entirely contiguous? */ @@ -145,7 +139,6 @@ void ADIOI_Flatten(MPI_Datatype datatype, ADIOI_Flatlist_node *flat, { DBG_FPRINTF(stderr,"ADIOI_Flatten:: types[%d]=%#llX\n",i,(unsigned long long)(unsigned long)types[i]); } - if(MPIU_DBG_SELECTED(DATATYPE,TYPICAL)) MPIDU_Datatype_debug(datatype, 4); /* use -env MPICH_DBG_OUTPUT=stdout */ #endif switch (combiner) { #ifdef MPIIMPL_HAVE_MPI_COMBINER_DUP @@ -458,6 +451,10 @@ void ADIOI_Flatten(MPI_Datatype datatype, ADIOI_Flatlist_node *flat, } break; + /* FIXME: using the same code as indexed_block for + * hindexed_block doesn't look correct. Needs to be carefully + * looked into. */ + case MPI_COMBINER_HINDEXED_BLOCK: case MPI_COMBINER_INDEXED_BLOCK: #ifdef FLATTEN_DEBUG DBG_FPRINTF(stderr,"ADIOI_Flatten:: MPI_COMBINER_INDEXED_BLOCK\n"); @@ -737,7 +734,7 @@ void ADIOI_Flatten(MPI_Datatype datatype, ADIOI_Flatlist_node *flat, int ADIOI_Count_contiguous_blocks(MPI_Datatype datatype, int *curr_index) { #ifdef HAVE_MPIR_TYPE_GET_CONTIG_BLOCKS - /* MPICH2 can get us this value without all the envelope/contents calls */ + /* MPICH can get us this value without all the envelope/contents calls */ int blks; MPIR_Type_get_contig_blocks(datatype, &blks); *curr_index = blks; diff --git a/ompi/mca/io/romio/romio/adio/common/get_fp_posn.c b/ompi/mca/io/romio/romio/adio/common/get_fp_posn.c index 1d7cab8c4b..0421a8d6e6 100644 --- a/ompi/mca/io/romio/romio/adio/common/get_fp_posn.c +++ b/ompi/mca/io/romio/romio/adio/common/get_fp_posn.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/common/greq_fns.c b/ompi/mca/io/romio/romio/adio/common/greq_fns.c index 8c2154eb0f..aff8ff77e5 100644 --- a/ompi/mca/io/romio/romio/adio/common/greq_fns.c +++ b/ompi/mca/io/romio/romio/adio/common/greq_fns.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2004 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/common/heap-sort.c b/ompi/mca/io/romio/romio/adio/common/heap-sort.c index 63b6c1c8b5..025a1a74c4 100644 --- a/ompi/mca/io/romio/romio/adio/common/heap-sort.c +++ b/ompi/mca/io/romio/romio/adio/common/heap-sort.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2008 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/common/iscontig.c b/ompi/mca/io/romio/romio/adio/common/iscontig.c index 1b47035cc6..3c8aa712f4 100644 --- a/ompi/mca/io/romio/romio/adio/common/iscontig.c +++ b/ompi/mca/io/romio/romio/adio/common/iscontig.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. @@ -9,27 +9,24 @@ #include "mpisgi2.h" #endif */ -#if (defined(MPICH) || defined(MPICH2)) -/* MPICH2 also provides this routine */ +#if defined(MPICH) +/* MPICH also provides this routine */ void MPIR_Datatype_iscontig(MPI_Datatype datatype, int *flag); void ADIOI_Datatype_iscontig(MPI_Datatype datatype, int *flag) { MPIR_Datatype_iscontig(datatype, flag); - /* if it is MPICH2 and the datatype is reported as contigous, - check if the true_lb is non-zero, and if so, mark the - datatype as noncontiguous */ -#ifdef MPICH2 + /* if the datatype is reported as contigous, check if the true_lb is + * non-zero, and if so, mark the datatype as noncontiguous */ if (*flag) { MPI_Aint true_extent, true_lb; - + MPI_Type_get_true_extent(datatype, &true_lb, &true_extent); if (true_lb > 0) *flag = 0; } -#endif } #elif (defined(MPIHP) && defined(HAVE_MPI_INFO)) diff --git a/ompi/mca/io/romio/romio/adio/common/lock.c b/ompi/mca/io/romio/romio/adio/common/lock.c index fda652c524..d064eded97 100644 --- a/ompi/mca/io/romio/romio/adio/common/lock.c +++ b/ompi/mca/io/romio/romio/adio/common/lock.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -152,7 +152,7 @@ int ADIOI_Set_lock(FDTYPE fd, int cmd, int type, ADIO_Offset offset, int whence, if (err && (errno != EBADF)) { /* FIXME: This should use the error message system, - especially for MPICH2 */ + especially for MPICH */ FPRINTF(stderr, "File locking failed in ADIOI_Set_lock(fd %X,cmd %s/%X,type %s/%X,whence %X) with return value %X and errno %X.\n" "- If the file system is NFS, you need to use NFS version 3, ensure that the lockd daemon is running on all the machines, and mount the directory with the 'noac' option (no attribute caching).\n" "- If the file system is LUSTRE, ensure that the directory is mounted with the 'flock' option.\n", diff --git a/ompi/mca/io/romio/romio/adio/common/malloc.c b/ompi/mca/io/romio/romio/adio/common/malloc.c index 55306842bd..4541a35e3a 100644 --- a/ompi/mca/io/romio/romio/adio/common/malloc.c +++ b/ompi/mca/io/romio/romio/adio/common/malloc.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -45,7 +45,7 @@ void *ADIOI_Malloc_fn(size_t size, int lineno, const char *fname) new = (void *) memalign(XFS_MEMALIGN, size); #else #ifdef HAVE_MPIU_FUNCS - new = (void *) MPIU_Malloc(size); + new = (void *) MPIU_trmalloc(size, lineno, fname); #else new = (void *) malloc(size); #endif @@ -64,7 +64,7 @@ void *ADIOI_Calloc_fn(size_t nelem, size_t elsize, int lineno, const char *fname void *new; #ifdef HAVE_MPIU_FUNCS - new = (void *) MPIU_Calloc(nelem, elsize); + new = (void *) MPIU_trcalloc(nelem, elsize, lineno, fname); #else new = (void *) calloc(nelem, elsize); #endif @@ -82,7 +82,7 @@ void *ADIOI_Realloc_fn(void *ptr, size_t size, int lineno, const char *fname) void *new; #ifdef HAVE_MPIU_FUNCS - new = (void *) MPIU_Realloc(ptr, size); + new = (void *) MPIU_trrealloc(ptr, size, lineno, fname); #else new = (void *) realloc(ptr, size); #endif @@ -104,7 +104,7 @@ void ADIOI_Free_fn(void *ptr, int lineno, const char *fname) } #ifdef HAVE_MPIU_FUNCS - MPIU_Free(ptr); + MPIU_trfree(ptr, lineno, fname); #else free(ptr); #endif diff --git a/ompi/mca/io/romio/romio/adio/common/req_malloc.c b/ompi/mca/io/romio/romio/adio/common/req_malloc.c index 5e7fb6c0ba..61018e1a68 100644 --- a/ompi/mca/io/romio/romio/adio/common/req_malloc.c +++ b/ompi/mca/io/romio/romio/adio/common/req_malloc.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/common/shfp_fname.c b/ompi/mca/io/romio/romio/adio/common/shfp_fname.c index 344d184d7a..024ced5e44 100644 --- a/ompi/mca/io/romio/romio/adio/common/shfp_fname.c +++ b/ompi/mca/io/romio/romio/adio/common/shfp_fname.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/common/status_setb.c b/ompi/mca/io/romio/romio/adio/common/status_setb.c index 37d150fe4a..7e46fbd571 100644 --- a/ompi/mca/io/romio/romio/adio/common/status_setb.c +++ b/ompi/mca/io/romio/romio/adio/common/status_setb.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -8,7 +8,7 @@ #include "adio.h" #include "mpi.h" -#if defined(MPICH2) +#if defined(MPICH2) || (defined(MPICH) && (MPICH_NAME >= 3)) /* Not quite correct, but much closer for MPI2 */ /* TODO: still needs to handle partial datatypes and situations where the mpi * implementation fills status with something other than bytes (globus2 might @@ -23,20 +23,6 @@ int MPIR_Status_set_bytes(MPI_Status *status, MPI_Datatype datatype, MPI_Status_set_elements(status, MPI_BYTE, nbytes); return MPI_SUCCESS; } -#elif defined(MPICH) - -void MPID_Status_set_bytes(MPI_Status *status, int nbytes); -int MPIR_Status_set_bytes(MPI_Status *status, MPI_Datatype datatype, - int nbytes); - -int MPIR_Status_set_bytes(MPI_Status *status, MPI_Datatype datatype, - int nbytes) -{ - if (status != MPI_STATUS_IGNORE) - MPID_Status_set_bytes(status, nbytes); - return MPI_SUCCESS; -} - #elif defined(MPILAM) || defined(MPISGI) int MPIR_Status_set_bytes(MPI_Status *status, MPI_Datatype datatype, int nbytes) diff --git a/ompi/mca/io/romio/romio/adio/common/strfns.c b/ompi/mca/io/romio/romio/adio/common/strfns.c index 08aeb4a8b1..65e5ac24e7 100644 --- a/ompi/mca/io/romio/romio/adio/common/strfns.c +++ b/ompi/mca/io/romio/romio/adio/common/strfns.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -11,7 +11,7 @@ /* * Below are the "safe" versions of the various string and printf - * operations. They are directly taken from MPICH2, with MPIU replaced by ADIOI. + * operations. They are directly taken from MPICH, with MPIU replaced by ADIOI. */ /* @@ -28,11 +28,11 @@ */ /*@ ADIOI_Strncpy - Copy a string with a maximum length - Input Parameters: +Input Parameters: + instr - String to copy - maxlen - Maximum total length of 'outstr' - Output Parameter: +Output Parameters: . outstr - String to copy into Notes: @@ -72,11 +72,11 @@ int ADIOI_Strncpy( char *dest, const char *src, size_t n ) any null, which is always added to the end of the line */ /*@ ADIOI_Strnapp - Append to a string with a maximum length - Input Parameters: +Input Parameters: + instr - String to copy - maxlen - Maximum total length of 'outstr' - Output Parameter: +Output Parameters: . outstr - String to copy into Notes: @@ -128,7 +128,7 @@ int ADIOI_Strnapp( char *dest, const char *src, size_t n ) char *ADIOI_Strdup( const char *str ) .ve - Input Parameter: +Input Parameters: . str - null-terminated string to duplicate Return value: diff --git a/ompi/mca/io/romio/romio/adio/common/system_hints.c b/ompi/mca/io/romio/romio/adio/common/system_hints.c index bd01d3b005..7fabaadb4e 100644 --- a/ompi/mca/io/romio/romio/adio/common/system_hints.c +++ b/ompi/mca/io/romio/romio/adio/common/system_hints.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- * vim: ts=8 sts=4 sw=4 noexpandtab * * Copyright (C) 2007 UChicago/Argonne LLC. diff --git a/ompi/mca/io/romio/romio/adio/include/Makefile.am b/ompi/mca/io/romio/romio/adio/include/Makefile.am deleted file mode 100644 index 53abee8c8b..0000000000 --- a/ompi/mca/io/romio/romio/adio/include/Makefile.am +++ /dev/null @@ -1,34 +0,0 @@ -# -# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana -# University Research and Technology -# Corporation. All rights reserved. -# Copyright (c) 2004-2005 The University of Tennessee and The University -# of Tennessee Research Foundation. All rights -# reserved. -# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, -# University of Stuttgart. All rights reserved. -# Copyright (c) 2004-2005 The Regents of the University of California. -# All rights reserved. -# Copyright (c) 2008 Cisco Systems, Inc. All rights reserved. -# $COPYRIGHT$ -# -# Additional copyrights may follow -# -# $HEADER$ -# - -include $(top_srcdir)/Makefile.options - -noinst_HEADERS = \ - adio_cb_config_list.h \ - adio_extern.h \ - adio.h \ - adioi_errmsg.h \ - adioi_error.h \ - adioi_fs_proto.h \ - adioi.h \ - heap-sort.h \ - mpio_error.h \ - mpipr.h \ - mpiu_greq.h \ - romioconf-undefs.h diff --git a/ompi/mca/io/romio/romio/adio/include/adio.h b/ompi/mca/io/romio/romio/adio/include/adio.h index 197a34ebad..3bac58e086 100644 --- a/ompi/mca/io/romio/romio/adio/include/adio.h +++ b/ompi/mca/io/romio/romio/adio/include/adio.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. @@ -103,6 +103,7 @@ # define ADIO_OFFSET OMPI_OFFSET_DATATYPE #else /* Open MPI: ignores all this stuff */ + #ifdef MPI_OFFSET_IS_INT typedef int ADIO_Offset; # define ADIO_OFFSET MPI_INT @@ -179,7 +180,7 @@ MPI_Info PMPI_Info_f2c(MPI_Fint info); char *strdup(const char *s); # endif #if defined(HAVE_READLINK) && defined(NEEDS_READLINK_DECL) && !defined(readlink) -int readlink(const char *path, char *buf, size_t bufsiz); +ssize_t readlink(const char *path, char *buf, size_t bufsiz); # endif #if defined(HAVE_LSTAT) && defined(NEEDS_LSTAT_DECL) && !defined(lstat) int lstat(const char *file_name, struct stat *buf); @@ -244,6 +245,9 @@ typedef struct ADIOI_FileD { ADIO_Offset *file_realm_st_offs; /* file realm starting offsets */ MPI_Datatype *file_realm_types; /* file realm datatypes */ int my_cb_nodes_index; /* my index into cb_config_list. -1 if N/A */ + /* External32 */ + int is_external32; /* bool: 0 means native view */ + } ADIOI_FileD; typedef struct ADIOI_FileD *ADIO_File; @@ -311,11 +315,16 @@ typedef struct { #define ADIO_FCNTL_GET_FSIZE 200 /* file system feature tests */ -#define ADIO_LOCKS 300 -#define ADIO_SHARED_FP 301 -#define ADIO_ATOMIC_MODE 302 -#define ADIO_DATA_SIEVING_WRITES 303 -#define ADIO_SCALABLE_OPEN 304 +#define ADIO_LOCKS 300 /* file system supports fcntl()-style locking */ +#define ADIO_SHARED_FP 301 /* file system supports shared file pointers */ +#define ADIO_ATOMIC_MODE 302 /* file system supports atomic mode */ +#define ADIO_DATA_SIEVING_WRITES 303 /* file system supports data sieving for writes */ +#define ADIO_SCALABLE_OPEN 304 /* one process can open the file and + broadcast result to all other + processors */ +#define ADIO_UNLINK_AFTER_CLOSE 305 /* supports posix semantic of keeping a + deleted file around until all + processors have closed it */ /* for default file permissions */ #define ADIO_PERM_NULL -1 @@ -330,10 +339,10 @@ typedef struct { void ADIO_Init(int *argc, char ***argv, int *error_code); void ADIO_End(int *error_code); -MPI_File ADIO_Open(MPI_Comm orig_comm, MPI_Comm comm, char *filename, +MPI_File ADIO_Open(MPI_Comm orig_comm, MPI_Comm comm, const char *filename, int file_system, ADIOI_Fns *ops, - int access_mode, ADIO_Offset disp, MPI_Datatype etype, - MPI_Datatype filetype, + int access_mode, ADIO_Offset disp, MPI_Datatype etype, + MPI_Datatype filetype, MPI_Info info, int perm, int *error_code); void ADIOI_OpenColl(ADIO_File fd, int rank, int acces_mode, int *error_code); void ADIO_ImmediateOpen(ADIO_File fd, int *error_code); @@ -371,7 +380,7 @@ void ADIO_ReadStrided(ADIO_File fd, void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code); -void ADIO_WriteStrided(ADIO_File fd, void *buf, int count, +void ADIO_WriteStrided(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code); @@ -397,7 +406,7 @@ void ADIO_Delete(char *filename, int *error_code); void ADIO_Flush(ADIO_File fd, int *error_code); void ADIO_Resize(ADIO_File fd, ADIO_Offset size, int *error_code); void ADIO_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code); -void ADIO_ResolveFileType(MPI_Comm comm, char *filename, int *fstype, +void ADIO_ResolveFileType(MPI_Comm comm, const char *filename, int *fstype, ADIOI_Fns **ops, int *error_code); void ADIO_Get_shared_fp(ADIO_File fd, int size, ADIO_Offset *shared_fp, int *error_code); diff --git a/ompi/mca/io/romio/romio/adio/include/adio_cb_config_list.h b/ompi/mca/io/romio/romio/adio/include/adio_cb_config_list.h index cf9fc541f1..ab2c5b501f 100644 --- a/ompi/mca/io/romio/romio/adio/include/adio_cb_config_list.h +++ b/ompi/mca/io/romio/romio/adio/include/adio_cb_config_list.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2001 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/include/adio_extern.h b/ompi/mca/io/romio/romio/adio/include/adio_extern.h index b1f7deea2c..9a7f2e59b0 100644 --- a/ompi/mca/io/romio/romio/adio/include/adio_extern.h +++ b/ompi/mca/io/romio/romio/adio/include/adio_extern.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/include/adioi.h b/ompi/mca/io/romio/romio/adio/include/adioi.h index 46dce9a8cb..219c7c8858 100644 --- a/ompi/mca/io/romio/romio/adio/include/adioi.h +++ b/ompi/mca/io/romio/romio/adio/include/adioi.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -115,7 +115,7 @@ typedef struct ADIOI_Fl_node { #endif typedef struct ADIOI_AIO_req_str { /* very wierd: if this MPI_Request is a pointer, some C++ compilers - * will clobber it when the MPICH2 C++ bindings are used */ + * will clobber it when the MPICH C++ bindings are used */ MPI_Request req; MPI_Offset nbytes; /* should probably make this a union */ @@ -140,16 +140,16 @@ struct ADIOI_Fns_struct { void (*ADIOI_xxx_Open) (ADIO_File fd, int *error_code); void (*ADIOI_xxx_OpenColl) (ADIO_File fd, int rank, int access_mode, int *error_code); - void (*ADIOI_xxx_ReadContig) (ADIO_File fd, void *buf, int count, - MPI_Datatype datatype, int file_ptr_type, + void (*ADIOI_xxx_ReadContig) (ADIO_File fd, void *buf, int count, + MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code); - void (*ADIOI_xxx_WriteContig) (ADIO_File fd, void *buf, int count, - MPI_Datatype datatype, int file_ptr_type, + void (*ADIOI_xxx_WriteContig) (ADIO_File fd, const void *buf, int count, + MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code); void (*ADIOI_xxx_ReadStridedColl) (ADIO_File fd, void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code); - void (*ADIOI_xxx_WriteStridedColl) (ADIO_File fd, void *buf, int count, + void (*ADIOI_xxx_WriteStridedColl) (ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code); ADIO_Offset (*ADIOI_xxx_SeekIndividual) (ADIO_File fd, ADIO_Offset offset, @@ -161,15 +161,15 @@ struct ADIOI_Fns_struct { void (*ADIOI_xxx_ReadStrided) (ADIO_File fd, void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code); - void (*ADIOI_xxx_WriteStrided) (ADIO_File fd, void *buf, int count, + void (*ADIOI_xxx_WriteStrided) (ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code); void (*ADIOI_xxx_Close) (ADIO_File fd, int *error_code); void (*ADIOI_xxx_IreadContig) (ADIO_File fd, void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Request *request, int *error_code); - void (*ADIOI_xxx_IwriteContig) (ADIO_File fd, void *buf, int count, - MPI_Datatype datatype, int file_ptr_type, + void (*ADIOI_xxx_IwriteContig) (ADIO_File fd, const void *buf, int count, + MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Request *request, int *error_code); int (*ADIOI_xxx_ReadDone) (ADIO_Request *request, ADIO_Status *status, int *error_code); @@ -182,12 +182,12 @@ struct ADIOI_Fns_struct { void (*ADIOI_xxx_IreadStrided) (ADIO_File fd, void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Request *request, int *error_code); - void (*ADIOI_xxx_IwriteStrided) (ADIO_File fd, void *buf, int count, + void (*ADIOI_xxx_IwriteStrided) (ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Request *request, int *error_code); void (*ADIOI_xxx_Flush) (ADIO_File fd, int *error_code); void (*ADIOI_xxx_Resize) (ADIO_File fd, ADIO_Offset size, int *error_code); - void (*ADIOI_xxx_Delete) (char *filename, int *error_code); + void (*ADIOI_xxx_Delete) (const char *filename, int *error_code); int (*ADIOI_xxx_Feature) (ADIO_File fd, int flag); }; @@ -345,7 +345,7 @@ void ADIOI_SCALEABLE_OpenColl(ADIO_File fd, int rank, int access_mode, int *error_code); void ADIOI_FAILSAFE_OpenColl(ADIO_File fd, int rank, int access_mode, int *error_code); -void ADIOI_GEN_Delete(char *filename, int *error_code); +void ADIOI_GEN_Delete(const char *filename, int *error_code); void ADIOI_GEN_ReadContig(ADIO_File fd, void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, @@ -356,11 +356,11 @@ void ADIOI_GEN_IreadContig(ADIO_File fd, void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Request *request, int *error_code); -void ADIOI_GEN_WriteContig(ADIO_File fd, void *buf, int count, +void ADIOI_GEN_WriteContig(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code); -void ADIOI_GEN_IwriteContig(ADIO_File fd, void *buf, int count, +void ADIOI_GEN_IwriteContig(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Request *request, int *error_code); @@ -372,7 +372,7 @@ void ADIOI_GEN_IreadStrided(ADIO_File fd, void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Request *request, int *error_code); -void ADIOI_GEN_IwriteStrided(ADIO_File fd, void *buf, int count, +void ADIOI_GEN_IwriteStrided(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Request *request, int *error_code); @@ -391,15 +391,15 @@ void ADIOI_GEN_ReadStrided_naive(ADIO_File fd, void *buf, int count, MPI_Datatype buftype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code); -void ADIOI_GEN_WriteStrided(ADIO_File fd, void *buf, int count, +void ADIOI_GEN_WriteStrided(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code); -void ADIOI_GEN_WriteStrided_naive(ADIO_File fd, void *buf, int count, +void ADIOI_GEN_WriteStrided_naive(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code); -void ADIOI_NOLOCK_WriteStrided(ADIO_File fd, void *buf, int count, +void ADIOI_NOLOCK_WriteStrided(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code); @@ -407,7 +407,7 @@ void ADIOI_GEN_ReadStridedColl(ADIO_File fd, void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code); -void ADIOI_GEN_WriteStridedColl(ADIO_File fd, void *buf, int count, +void ADIOI_GEN_WriteStridedColl(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Status *status, int *error_code); @@ -561,6 +561,7 @@ int ADIOI_End_call(MPI_Comm comm, int keyval, void *attribute_val, void *extra_s int MPIR_Status_set_bytes(MPI_Status *status, MPI_Datatype datatype, int nbytes); int ADIOI_Uses_generic_read(ADIO_File fd); int ADIOI_Uses_generic_write(ADIO_File fd); +int ADIOI_Err_create_code(const char *myname, const char *filename, int my_errno); int ADIOI_FAKE_IODone(ADIO_Request *request, ADIO_Status *status, @@ -573,11 +574,11 @@ void ADIOI_FAKE_IreadStrided(ADIO_File fd, void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Request *request, int *error_code); -void ADIOI_FAKE_IwriteContig(ADIO_File fd, void *buf, int count, +void ADIOI_FAKE_IwriteContig(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Request *request, - int *error_code); -void ADIOI_FAKE_IwriteStrided(ADIO_File fd, void *buf, int count, + int *error_code); +void ADIOI_FAKE_IwriteStrided(ADIO_File fd, const void *buf, int count, MPI_Datatype datatype, int file_ptr_type, ADIO_Offset offset, ADIO_Request *request, int *error_code); @@ -597,7 +598,7 @@ int MPIOI_File_read(MPI_File fh, int MPIOI_File_write(MPI_File fh, MPI_Offset offset, int file_ptr_type, - void *buf, + const void *buf, int count, MPI_Datatype datatype, char *myname, @@ -613,7 +614,7 @@ int MPIOI_File_read_all(MPI_File fh, int MPIOI_File_write_all(MPI_File fh, MPI_Offset offset, int file_ptr_type, - void *buf, + const void *buf, int count, MPI_Datatype datatype, char *myname, @@ -628,7 +629,7 @@ int MPIOI_File_read_all_begin(MPI_File fh, int MPIOI_File_write_all_begin(MPI_File fh, MPI_Offset offset, int file_ptr_type, - void *buf, + const void *buf, int count, MPI_Datatype datatype, char *myname); @@ -637,13 +638,13 @@ int MPIOI_File_read_all_end(MPI_File fh, char *myname, MPI_Status *status); int MPIOI_File_write_all_end(MPI_File fh, - void *buf, + const void *buf, char *myname, MPI_Status *status); int MPIOI_File_iwrite(MPI_File fh, MPI_Offset offset, int file_ptr_type, - void *buf, + const void *buf, int count, MPI_Datatype datatype, char *myname, @@ -664,19 +665,19 @@ int MPIOI_File_iread(MPI_File fh, #if (defined(ROMIO_HFS) || defined(ROMIO_XFS)) # define ADIOI_WRITE_LOCK(fd, offset, whence, len) \ - if (((fd)->file_system == ADIO_XFS) || ((fd)->file_system == ADIO_HFS)) \ + do {if (((fd)->file_system == ADIO_XFS) || ((fd)->file_system == ADIO_HFS)) \ ADIOI_Set_lock64((fd)->fd_sys, F_SETLKW64, F_WRLCK, offset, whence, len);\ - else ADIOI_Set_lock((fd)->fd_sys, F_SETLKW, F_WRLCK, offset, whence, len) + else ADIOI_Set_lock((fd)->fd_sys, F_SETLKW, F_WRLCK, offset, whence, len); } while (0) # define ADIOI_READ_LOCK(fd, offset, whence, len) \ - if (((fd)->file_system == ADIO_XFS) || ((fd)->file_system == ADIO_HFS)) \ + do {if (((fd)->file_system == ADIO_XFS) || ((fd)->file_system == ADIO_HFS)) \ ADIOI_Set_lock64((fd)->fd_sys, F_SETLKW64, F_RDLCK, offset, whence, len);\ - else ADIOI_Set_lock((fd)->fd_sys, F_SETLKW, F_RDLCK, offset, whence, len) + else ADIOI_Set_lock((fd)->fd_sys, F_SETLKW, F_RDLCK, offset, whence, len); }while (0) # define ADIOI_UNLOCK(fd, offset, whence, len) \ - if (((fd)->file_system == ADIO_XFS) || ((fd)->file_system == ADIO_HFS)) \ + do {if (((fd)->file_system == ADIO_XFS) || ((fd)->file_system == ADIO_HFS)) \ ADIOI_Set_lock64((fd)->fd_sys, F_SETLK64, F_UNLCK, offset, whence, len); \ - else ADIOI_Set_lock((fd)->fd_sys, F_SETLK, F_UNLCK, offset, whence, len) + else ADIOI_Set_lock((fd)->fd_sys, F_SETLK, F_UNLCK, offset, whence, len); }while (0) #elif (defined(ROMIO_NTFS)) @@ -808,9 +809,13 @@ int ADIOI_MPE_openinternal_a; int ADIOI_MPE_openinternal_b; int ADIOI_MPE_stat_a; int ADIOI_MPE_stat_b; +int ADIOI_MPE_iread_a; +int ADIOI_MPE_iread_b; +int ADIOI_MPE_iwrite_a; +int ADIOI_MPE_iwrite_b; #endif -#ifdef ROMIO_INSIDE_MPICH2 +#ifdef ROMIO_INSIDE_MPICH /* Assert that this MPI_Aint value can be cast to a ptr value without problem.*/ /* Basic idea is the value should be unchanged after casting (no loss of (meaningful) high order bytes in 8 byte MPI_Aint @@ -818,7 +823,7 @@ int ADIOI_MPE_stat_b; /* Should work even on 64bit or old 32bit configs */ /* Use MPID_Ensure_Aint_fits_in_pointer from mpiutil.h and MPI_AINT_CAST_TO_VOID_PTR from configure (mpi.h) */ - #include "mpiimpl.h" + #include "glue_romio.h" #define ADIOI_AINT_CAST_TO_VOID_PTR (void*)(MPIR_Pint) /* The next two casts are only used when you don't want sign extension @@ -826,8 +831,8 @@ int ADIOI_MPE_stat_b; #define ADIOI_AINT_CAST_TO_LONG_LONG (long long) #define ADIOI_AINT_CAST_TO_OFFSET ADIOI_AINT_CAST_TO_LONG_LONG - #define ADIOI_ENSURE_AINT_FITS_IN_PTR(aint_value) MPID_Ensure_Aint_fits_in_pointer(aint_value) - #define ADIOI_Assert MPIU_Assert + #define ADIOI_ENSURE_AINT_FITS_IN_PTR(aint_value) MPIR_Ext_ensure_Aint_fits_in_pointer(aint_value) + #define ADIOI_Assert MPIR_Ext_assert #else #include #define ADIOI_AINT_CAST_TO_VOID_PTR (void*) @@ -835,20 +840,20 @@ int ADIOI_MPE_stat_b; #define ADIOI_AINT_CAST_TO_OFFSET ADIOI_AINT_CAST_TO_LONG_LONG #define ADIOI_ENSURE_AINT_FITS_IN_PTR(aint_value) #define ADIOI_Assert assert - #define MPIR_Upint unsigned int + #define MPIR_Upint unsigned long #define MPIU_THREADPRIV_DECL #endif #ifdef USE_DBG_LOGGING /*todo fix dependency on mpich?*/ /* DBGT_FPRINTF terse level printing */ -#define DBGT_FPRINTF if (MPIU_DBG_SELECTED(ROMIO,VERBOSE)) fprintf(stderr,"%s:%d:",__FILE__,__LINE__); \ -if (MPIU_DBG_SELECTED(ROMIO,TERSE)) fprintf +#define DBGT_FPRINTF if (MPIR_Ext_dbg_romio_verbose_enabled) fprintf(stderr,"%s:%d:",__FILE__,__LINE__); \ +if (MPIR_Ext_dbg_romio_terse_enabled) fprintf /* DBG_FPRINTF default (typical level) printing */ -#define DBG_FPRINTF if (MPIU_DBG_SELECTED(ROMIO,VERBOSE)) fprintf(stderr,"%s:%d:",__FILE__,__LINE__); \ -if (MPIU_DBG_SELECTED(ROMIO,TYPICAL)) fprintf +#define DBG_FPRINTF if (MPIR_Ext_dbg_romio_verbose_enabled) fprintf(stderr,"%s:%d:",__FILE__,__LINE__); \ +if (MPIR_Ext_dbg_romio_typical_enabled) fprintf /* DBGV_FPRINTF verbose level printing */ -#define DBGV_FPRINTF if (MPIU_DBG_SELECTED(ROMIO,VERBOSE)) fprintf(stderr,"%s:%d:",__FILE__,__LINE__); \ - if (MPIU_DBG_SELECTED(ROMIO,VERBOSE)) fprintf +#define DBGV_FPRINTF if (MPIR_Ext_dbg_romio_verbose_enabled) fprintf(stderr,"%s:%d:",__FILE__,__LINE__); \ + if (MPIR_Ext_dbg_romio_verbose_enabled) fprintf #else /* compile it out */ #define DBGT_FPRINTF if (0) fprintf #define DBG_FPRINTF if (0) fprintf diff --git a/ompi/mca/io/romio/romio/adio/include/adioi_errmsg.h b/ompi/mca/io/romio/romio/adio/include/adioi_errmsg.h index 79f9c9e1cd..b1cdb4577a 100644 --- a/ompi/mca/io/romio/romio/adio/include/adioi_errmsg.h +++ b/ompi/mca/io/romio/romio/adio/include/adioi_errmsg.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. diff --git a/ompi/mca/io/romio/romio/adio/include/adioi_error.h b/ompi/mca/io/romio/romio/adio/include/adioi_error.h index d7c3ad233a..e0870554e2 100644 --- a/ompi/mca/io/romio/romio/adio/include/adioi_error.h +++ b/ompi/mca/io/romio/romio/adio/include/adioi_error.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. @@ -15,18 +15,33 @@ if ((fh <= (ADIO_File) 0) || \ error_code = MPIO_Err_create_code(MPI_SUCCESS, \ MPIR_ERR_RECOVERABLE, \ myname, __LINE__, \ - MPI_ERR_ARG, \ + MPI_ERR_FILE, \ "**iobadfh", 0); \ error_code = MPIO_Err_return_file(MPI_FILE_NULL, error_code);\ goto fn_exit; \ } +/* TODO could add more glue code to help check for handle validity, or perhaps + * do some sort of always-safe attribute/info call to check for handle validity */ +#define MPIO_CHECK_COMM(comm_, myname_, error_code_) \ + do { \ + if ((comm_) == MPI_COMM_NULL) { \ + error_code = MPIO_Err_create_code(MPI_SUCCESS, \ + MPIR_ERR_RECOVERABLE, \ + (myname_), __LINE__, \ + MPI_ERR_COMM, \ + "**commnull", 0); \ + error_code_ = MPIO_Err_return_file(MPI_FILE_NULL, (error_code_)); \ + goto fn_exit; \ + } \ + } while (0) + #define MPIO_CHECK_COUNT(fh, count, myname, error_code) \ if (count < 0) { \ error_code = MPIO_Err_create_code(MPI_SUCCESS, \ MPIR_ERR_RECOVERABLE, \ myname, __LINE__, \ - MPI_ERR_ARG, \ + MPI_ERR_COUNT, \ "**iobadcount", 0); \ error_code = MPIO_Err_return_file(fh, error_code); \ goto fn_exit; \ @@ -43,16 +58,23 @@ if (count*datatype_size != (ADIO_Offset)(unsigned)count*(ADIO_Offset)(unsigned)d goto fn_exit; \ } -#define MPIO_CHECK_DATATYPE(fh, datatype, myname, error_code) \ -if (datatype == MPI_DATATYPE_NULL) { \ - error_code = MPIO_Err_create_code(MPI_SUCCESS, \ - MPIR_ERR_RECOVERABLE, \ - myname, __LINE__, \ - MPI_ERR_TYPE, \ - "**dtypenull", 0); \ - error_code = MPIO_Err_return_file(fh, error_code); \ - goto fn_exit; \ -} +#define MPIO_CHECK_DATATYPE(fh, datatype, myname, error_code) \ + do { \ + if (datatype == MPI_DATATYPE_NULL) { \ + error_code = MPIO_Err_create_code(MPI_SUCCESS, \ + MPIR_ERR_RECOVERABLE, \ + myname, __LINE__, \ + MPI_ERR_TYPE, \ + "**dtypenull", 0); \ + } \ + else { \ + MPIO_DATATYPE_ISCOMMITTED(datatype, error_code); \ + } \ + if (error_code != MPI_SUCCESS) { \ + error_code = MPIO_Err_return_file(fh, error_code); \ + goto fn_exit; \ + } \ + } while (0) #define MPIO_CHECK_READABLE(fh, myname, error_code) \ if (fh->access_mode & ADIO_WRONLY) { \ @@ -138,3 +160,14 @@ if ((fh->file_system == ADIO_PIOFS) || \ #define ADIOI_TEST_DEFERRED(fh, myname, error_code)\ if(! (fh)->is_open ) {\ ADIO_ImmediateOpen((fh), (error_code)); } + +/* Check MPI_Info object by calling MPI_Info_dup, if the info object is valid +then the dup operation will succeed */ +#define MPIO_CHECK_INFO(info, error_code) { \ + MPI_Info dupinfo; \ + error_code = MPI_Info_dup(info, &dupinfo); \ + if(error_code != MPI_SUCCESS) goto fn_fail; \ + if (dupinfo != MPI_INFO_NULL) { \ + MPI_Info_free(&dupinfo); \ + } \ +} diff --git a/ompi/mca/io/romio/romio/adio/include/adioi_fs_proto.h b/ompi/mca/io/romio/romio/adio/include/adioi_fs_proto.h index 88c3a838fc..d28c1231dd 100644 --- a/ompi/mca/io/romio/romio/adio/include/adioi_fs_proto.h +++ b/ompi/mca/io/romio/romio/adio/include/adioi_fs_proto.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/adio/include/mpio_error.h b/ompi/mca/io/romio/romio/adio/include/mpio_error.h index 2a5e524cfa..f9d22b1721 100644 --- a/ompi/mca/io/romio/romio/adio/include/mpio_error.h +++ b/ompi/mca/io/romio/romio/adio/include/mpio_error.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. diff --git a/ompi/mca/io/romio/romio/adio/include/mpipr.h b/ompi/mca/io/romio/romio/adio/include/mpipr.h index a609f7bf45..73f798c7b1 100644 --- a/ompi/mca/io/romio/romio/adio/include/mpipr.h +++ b/ompi/mca/io/romio/romio/adio/include/mpipr.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. @@ -251,6 +251,8 @@ /* #define MPI_Type_create_darray PMPI_Type_create_darray */ #undef MPI_Type_create_indexed_block #define MPI_Type_create_indexed_block PMPI_Type_create_indexed_block +#undef MPI_Type_create_hindexed_block +#define MPI_Type_create_hindexed_block PMPI_Type_create_hindexed_block /* #define MPI_Type_create_subarray PMPI_Type_create_subarray */ #undef MPI_Type_extent #define MPI_Type_extent PMPI_Type_extent diff --git a/ompi/mca/io/romio/romio/adio/include/mpiu_external32.h b/ompi/mca/io/romio/romio/adio/include/mpiu_external32.h new file mode 100644 index 0000000000..4302373774 --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/include/mpiu_external32.h @@ -0,0 +1,22 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ +/* + * + * (C) 2012 by Argonne National Laboratory. + * See COPYRIGHT in top-level directory. + */ + +#ifndef _MPIU_EXTERNAL32_H_ +#define _MPIU_EXTERNAL32_H_ + +int MPIU_write_external32_conversion_fn (const void *userbuf, MPI_Datatype datatype, + int count, void *filebuf); +int MPIU_read_external32_conversion_fn(void *userbuf, MPI_Datatype datatype, + int count, void *filebuf); +int MPIU_datatype_full_size(MPI_Datatype datatype, MPI_Aint *size); + +/* given a buffer, count, and datatype, return an apropriately sized and + * * external32-formatted buffer, suitable for handing off to a subsequent write + * * routine */ +int MPIU_external32_buffer_setup(const void * buf, int count, MPI_Datatype type, void **newbuf); + +#endif diff --git a/ompi/mca/io/romio/romio/adio/include/mpiu_greq.h b/ompi/mca/io/romio/romio/adio/include/mpiu_greq.h index d924e277a7..e3fce1c41d 100644 --- a/ompi/mca/io/romio/romio/adio/include/mpiu_greq.h +++ b/ompi/mca/io/romio/romio/adio/include/mpiu_greq.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * (C) 2003 by Argonne National Laboratory. diff --git a/ompi/mca/io/romio/romio/adio/include/nopackage.h b/ompi/mca/io/romio/romio/adio/include/nopackage.h new file mode 100644 index 0000000000..184e4b4ac8 --- /dev/null +++ b/ompi/mca/io/romio/romio/adio/include/nopackage.h @@ -0,0 +1,16 @@ +/* + * (C) 2011 by Argonne National Laboratory. + * See COPYRIGHT in top-level directory. + */ +/* See comments in MPICH's configure.ac for an explanation of what this file is + * and why it exists. */ + +/* intentionally omitting any #ifndef guard, repeated inclusion is intentional */ +#undef PACKAGE +#undef PACKAGE_BUGREPORT +#undef PACKAGE_NAME +#undef PACKAGE_STRING +#undef PACKAGE_TARNAME +#undef PACKAGE_URL +#undef PACKAGE_VERSION + diff --git a/ompi/mca/io/romio/romio/adio/include/romioconf-undefs.h b/ompi/mca/io/romio/romio/adio/include/romioconf-undefs.h index 79b9df5683..e7d66db985 100644 --- a/ompi/mca/io/romio/romio/adio/include/romioconf-undefs.h +++ b/ompi/mca/io/romio/romio/adio/include/romioconf-undefs.h @@ -38,5 +38,8 @@ #if defined(PACKAGE_VERSION) #undef PACKAGE_VERSION #endif +#if defined(PACKAGE_URL) +#undef PACKAGE_URL +#endif #endif /* ROMIOCONF_UNDEFS_H */ diff --git a/ompi/mca/io/romio/romio/autogen.sh b/ompi/mca/io/romio/romio/autogen.sh index 458232464a..dcc84c738a 100755 --- a/ompi/mca/io/romio/romio/autogen.sh +++ b/ompi/mca/io/romio/romio/autogen.sh @@ -1,2 +1,3 @@ -: -autoreconf -ivf -I confdb +#!/bin/sh + +${AUTORECONF:-autoreconf} ${autoreconf_args:-"-vif"} -I confdb diff --git a/ompi/mca/io/romio/romio/confdb/aclocal_attr_alias.m4 b/ompi/mca/io/romio/romio/confdb/aclocal_attr_alias.m4 index da49328105..32f016546d 100644 --- a/ompi/mca/io/romio/romio/confdb/aclocal_attr_alias.m4 +++ b/ompi/mca/io/romio/romio/confdb/aclocal_attr_alias.m4 @@ -161,8 +161,8 @@ dnl nm -P -g pac_conftest_other.$OBJEXT | grep -i "mpifcmb" pac_c_attr_alias_main=no if test "$pac_c_attr_alias_other" = "yes" ; then -# Save LIBS for later restoration. - saved_LIBS="$LIBS" +# Push LIBS for later restoration. + PAC_PUSH_FLAG([LIBS]) LIBS="pac_conftest_other.$OBJEXT $LIBS" # Link the "other" __attribute__ object file. @@ -207,8 +207,8 @@ dnl nm -P -g pac_conftest_main$EXEEXT | grep -i "mpifcmb" dnl cp conftest.$ac_ext pac_conftest_main.$ac_ext ]) dnl Endof AC_LINK_IFELSE -# Restore the previously saved LIBS - LIBS="$saved_LIBS" +# Restore the previously pushed LIBS + PAC_POP_FLAG([LIBS]) rm -f pac_conftest_other.$OBJEXT fi dnl Endof if test "$pac_c_attr_alias_other" = "yes" @@ -372,11 +372,11 @@ AC_LANG_PUSH([C]) AC_COMPILE_IFELSE([AC_LANG_SOURCE([])],[ cp conftest.$ac_ext pac_conftest.c PAC_RUNLOG([mv conftest.$OBJEXT pac_conftest.$OBJEXT]) - saved_LIBS="$LIBS" + PAC_PUSH_FLAG([LIBS]) LIBS="pac_conftest.$OBJEXT $LIBS" AC_LANG_PUSH([Fortran]) dnl AC_LANG_PUSH([Fortran 77]) - saved_ac_link="$ac_link" - ac_link="`echo $saved_ac_link | sed -e 's|>.*$|> $pac_logfile 2>\&1|g'`" + PAC_PUSH_FLAG([ac_link]) + ac_link="`echo $ac_link | sed -e 's|>.*$|> $pac_logfile 2>\&1|g'`" pac_logfile="pac_align0.log" rm -f $pac_logfile AC_LINK_IFELSE([],[ @@ -387,9 +387,9 @@ AC_COMPILE_IFELSE([AC_LANG_SOURCE([])],[ # Be sure NOT to remove the conftest.f which is still needed for later use. # rm -f conftest.$ac_ext # Restore everything in autoconf that has been overwritten - ac_link="$saved_ac_link" - # restore previously saved LIBS - LIBS="$saved_LIBS" + PAC_POP_FLAG([ac_link]) + # restore previously pushed LIBS + PAC_POP_FLAG([LIBS]) AC_LANG_POP([Fortran]) dnl AC_LANG_POP([Fortran 77]) ],[ pac_f2c_alignedn_diffbase=no @@ -430,11 +430,11 @@ extern mpif_cmblk_t mpifcmb_ __attribute__ ((alias("mpifcmbr"))); ],[ cp conftest.$ac_ext pac_conftest.c PAC_RUNLOG([mv conftest.$OBJEXT pac_conftest.$OBJEXT]) - saved_LIBS="$LIBS" + PAC_PUSH_FLAG([LIBS]) LIBS="pac_conftest.$OBJEXT $LIBS" AC_LANG_PUSH([Fortran]) dnl AC_LANG_PUSH([Fortran 77]) - saved_ac_link="$ac_link" - ac_link="`echo $saved_ac_link | sed -e 's|>.*$|> $pac_logfile 2>\&1|g'`" + PAC_PUSH_FLAG([ac_link]) + ac_link="`echo $ac_link | sed -e 's|>.*$|> $pac_logfile 2>\&1|g'`" pac_logfile="pac_align1.log" rm -f $pac_logfile # Use conftest.f created in CONFTEST. @@ -453,9 +453,9 @@ extern mpif_cmblk_t mpifcmb_ __attribute__ ((alias("mpifcmbr"))); pac_attr_alignedn=no ]) # Restore everything in autoconf that has been overwritten - ac_link="$saved_ac_link" - # restore previously saved LIBS - LIBS="$saved_LIBS" + PAC_POP_FLAG([ac_link]) + # restore previously pushed LIBS + PAC_POP_FLAG([LIBS]) AC_LANG_POP([Fortran]) dnl AC_LANG_POP([Fortran 77]) # remove previously generated object file and C file. rm -f pac_conftest.$OBJEXT pac_conftest.c diff --git a/ompi/mca/io/romio/romio/confdb/aclocal_cc.m4 b/ompi/mca/io/romio/romio/confdb/aclocal_cc.m4 index 91b26de324..91dbae4b7a 100644 --- a/ompi/mca/io/romio/romio/confdb/aclocal_cc.m4 +++ b/ompi/mca/io/romio/romio/confdb/aclocal_cc.m4 @@ -3,11 +3,17 @@ ifdef([AC_PROG_CC_GNU],,[AC_DEFUN([AC_PROG_CC_GNU],)]) dnl PAC_PROG_CC - reprioritize the C compiler search order AC_DEFUN([PAC_PROG_CC],[ + dnl Many standard autoconf/automake/libtool macros, such as LT_INIT, + dnl perform an AC_REQUIRE([AC_PROG_CC]). If this macro (PAC_PROG_CC) + dnl comes after LT_INIT (or similar) then the default compiler search + dnl path will be used instead. This AC_BEFORE macro ensures that a + dnl warning will be emitted at autoconf-time (autogen.sh-time) to help + dnl developers notice this case. + AC_BEFORE([$0],[AC_PROG_CC]) PAC_PUSH_FLAG([CFLAGS]) - AC_PROG_CC([gcc icc pgcc xlc xlC pathcc cc]) + AC_PROG_CC([icc pgcc xlc xlC pathcc cc gcc clang]) PAC_POP_FLAG([CFLAGS]) ]) - dnl dnl/*D dnl PAC_C_CHECK_COMPILER_OPTION - Check that a compiler option is accepted @@ -30,71 +36,111 @@ dnl dnl Because this is a long script, we have ensured that you can pass a dnl variable containing the option name as the first argument. dnl -dnl gcc 4.2.4 on 32-bit does not complain about the -Wno-type-limits option -dnl even though it doesn't support it. However, when another warning is -dnl triggered, it gives an error that the option is not recognized. So we -dnl need to test with a conftest file that will generate warnings dnl D*/ AC_DEFUN([PAC_C_CHECK_COMPILER_OPTION],[ AC_MSG_CHECKING([whether C compiler accepts option $1]) -pccco_save_CFLAGS="$CFLAGS" -CFLAGS="$1 $CFLAGS" -rm -f conftest.out -pac_success=no -# conftest3.c has an invalid prototype to ensure we generate warnings -echo 'int main(){}' > conftest3.c -echo 'int foo(void);int foo(void){return 0;}' > conftest2.c -echo 'int main(void);int main(void){return 0;}' > conftest.c -if ${CC-cc} $CFLAGS $CPPFLAGS -o conftest conftest3.c $LDFLAGS >/dev/null 2>&1 && - ${CC-cc} $pccco_save_CFLAGS $CPPFLAGS -o conftest conftest.c $LDFLAGS >conftest.bas 2>&1 ; then - if ${CC-cc} $CFLAGS $CPPFLAGS -o conftest conftest.c $LDFLAGS >conftest.out 2>&1 ; then - if diff -b conftest.out conftest.bas >/dev/null 2>&1 ; then - AC_MSG_RESULT(yes) - AC_MSG_CHECKING([whether routines compiled with $1 can be linked with ones compiled without $1]) - rm -f conftest.out - rm -f conftest.bas - if ${CC-cc} -c $pccco_save_CFLAGS $CPPFLAGS conftest2.c >conftest2.out 2>&1 ; then - if ${CC-cc} $CFLAGS $CPPFLAGS -o conftest conftest2.o conftest.c $LDFLAGS >conftest.bas 2>&1 ; then - if ${CC-cc} $CFLAGS $CPPFLAGS -o conftest conftest2.o conftest.c $LDFLAGS >conftest.out 2>&1 ; then - if diff -b conftest.out conftest.bas >/dev/null 2>&1 ; then - pac_success=yes - else - : - fi - else - : - fi - else - # Could not link with the option! - : - fi - else - if test -s conftest2.out ; then - cat conftest2.out >&AC_FD_CC - fi - fi - else - : - fi - else - : - fi -else - # Could not compile without the option! - : +pac_opt="$1" +AC_LANG_PUSH([C]) +CFLAGS_orig="$CFLAGS" +CFLAGS_opt="$pac_opt $CFLAGS" +pac_result="unknown" + +AC_LANG_CONFTEST([AC_LANG_PROGRAM()]) +CFLAGS="$CFLAGS_orig" +rm -f pac_test1.log +PAC_LINK_IFELSE_LOG([pac_test1.log], [], [ + CFLAGS="$CFLAGS_opt" + rm -f pac_test2.log + PAC_LINK_IFELSE_LOG([pac_test2.log], [], [ + PAC_RUNLOG_IFELSE([diff -b pac_test1.log pac_test2.log], + [pac_result=yes],[pac_result=no]) + ],[ + pac_result=no + ]) +], [ + pac_result=no +]) +AC_MSG_RESULT([$pac_result]) +dnl Delete the conftest created by AC_LANG_CONFTEST. +rm -f conftest.$ac_ext + +# gcc 4.2.4 on 32-bit does not complain about the -Wno-type-limits option +# even though it doesn't support it. However, when another warning is +# triggered, it gives an error that the option is not recognized. So we +# need to test with a conftest file that will generate warnings. +# +# add an extra switch, pac_c_check_compiler_option_prototest, to +# disable this test just in case some new compiler does not like it. +# +# Linking with a program with an invalid prototype to ensure a compiler warning. + +if test "$pac_result" = "yes" \ + -a "$pac_c_check_compiler_option_prototest" != "no" ; then + AC_MSG_CHECKING([whether C compiler option $1 works with an invalid prototype program]) + AC_LINK_IFELSE([ + dnl We want a warning, but we don't want to inadvertently disable + dnl special warnings like -Werror-implicit-function-declaration (e.g., + dnl in PAC_CC_STRICT) by compiling something that might actually be + dnl treated as an error by the compiler. So we try to elicit an + dnl "unused variable" warning and/or an "uninitialized" warning with the + dnl test program below. + dnl + dnl The old sanity program was: + dnl void main() {return 0;} + dnl which clang (but not GCC) would treat as an *error*, invalidating + dnl the test for any given parameter. + AC_LANG_SOURCE([int main(int argc, char **argv){ int foo, bar = 0; foo += 1; return foo; }]) + ],[pac_result=yes],[pac_result=no]) + AC_MSG_RESULT([$pac_result]) fi -CFLAGS="$pccco_save_CFLAGS" -if test "$pac_success" = yes ; then - AC_MSG_RESULT(yes) - ifelse($2,,COPTIONS="$COPTIONS $1",$2) -else - AC_MSG_RESULT(no) - if test -s conftest.out ; then cat conftest.out >&AC_FD_CC ; fi - $3 +# +if test "$pac_result" = "yes" ; then + AC_MSG_CHECKING([whether routines compiled with $pac_opt can be linked with ones compiled without $pac_opt]) + pac_result=unknown + CFLAGS="$CFLAGS_orig" + rm -f pac_test3.log + PAC_COMPILE_IFELSE_LOG([pac_test3.log], [ + AC_LANG_SOURCE([ + int foo(void); + int foo(void){return 0;} + ]) + ],[ + PAC_RUNLOG([mv conftest.$OBJEXT pac_conftest.$OBJEXT]) + saved_LIBS="$LIBS" + LIBS="pac_conftest.$OBJEXT $LIBS" + + rm -f pac_test4.log + PAC_LINK_IFELSE_LOG([pac_test4.log], [AC_LANG_PROGRAM()], [ + CFLAGS="$CFLAGS_opt" + rm -f pac_test5.log + PAC_LINK_IFELSE_LOG([pac_test5.log], [AC_LANG_PROGRAM()], [ + PAC_RUNLOG_IFELSE([diff -b pac_test4.log pac_test5.log], + [pac_result=yes], [pac_result=no]) + ],[ + pac_result=no + ]) + ],[ + pac_result=no + ]) + LIBS="$saved_LIBS" + rm -f pac_conftest.$OBJEXT + ],[ + pac_result=no + ]) + AC_MSG_RESULT([$pac_result]) + rm -f pac_test3.log pac_test4.log pac_test5.log fi -# This is needed for Mac OSX 10.5 -rm -rf conftest.dSYM -rm -f conftest* +rm -f pac_test1.log pac_test2.log + +dnl Restore CFLAGS before 2nd/3rd argument commands are executed, +dnl as 2nd/3rd argument command could be modifying CFLAGS. +CFLAGS="$CFLAGS_orig" +if test "$pac_result" = "yes" ; then + ifelse([$2],[],[COPTIONS="$COPTIONS $1"],[$2]) +else + ifelse([$3],[],[:],[$3]) +fi +AC_LANG_POP([C]) ]) dnl dnl/*D @@ -223,66 +269,46 @@ int Foo(int a) { return a; } # only within a single object file! This tests that case. # Note that there is an extern int PFoo declaration before the # pragma. Some compilers require this in order to make the weak symbol -# extenally visible. +# externally visible. if test "$has_pragma_weak" = yes ; then - # This is needed for Mac OSX 10.5 - rm -rf conftest.dSYM - rm -f conftest* - cat >>conftest1.c <>conftest2.c <>conftest1.c <>conftest2.c <> config.log - echo "Failed program was" >> config.log - cat conftest1.c >>config.log - cat conftest2.c >>config.log - if test -s conftest.out ; then cat conftest.out >> config.log ; fi + ],[ has_pragma_weak=0 pragma_extra_message="pragma weak accepted but does not work (probably creates two non-weak entries)" - fi - else - echo "$ac_link2" >>config.log - echo "Failed program was" >>config.log - cat conftest1.c >>config.log - cat conftest2.c >>config.log - if test -s conftest.out ; then cat conftest.out >> config.log ; fi - has_pragma_weak=0 - pragma_extra_message="pragma weak does not work outside of a file" - fi - # This is needed for Mac OSX 10.5 - rm -rf conftest.dSYM - rm -f conftest* + ]) + ],[ + has_pragma_weak=0 + pragma_extra_message="pragma weak accepted but does not work (probably creates two non-weak entries)" + ]) fi dnl if test -z "$pac_cv_prog_c_weak_symbols" ; then @@ -316,12 +342,12 @@ if test "$pac_cv_prog_c_weak_symbols" = "no" ; then ifelse([$2],,:,[$2]) else case "$pac_cv_prog_c_weak_symbols" in - "pragma weak") AC_DEFINE(HAVE_PRAGMA_WEAK,1,[Supports weak pragma]) - ;; - "pragma _HP") AC_DEFINE(HAVE_PRAGMA_HP_SEC_DEF,1,[HP style weak pragma]) - ;; - "pragma _CRI") AC_DEFINE(HAVE_PRAGMA_CRI_DUP,1,[Cray style weak pragma]) - ;; + "pragma weak") AC_DEFINE(HAVE_PRAGMA_WEAK,1,[Supports weak pragma]) + ;; + "pragma _HP") AC_DEFINE(HAVE_PRAGMA_HP_SEC_DEF,1,[HP style weak pragma]) + ;; + "pragma _CRI") AC_DEFINE(HAVE_PRAGMA_CRI_DUP,1,[Cray style weak pragma]) + ;; esac ifelse([$1],,:,[$1]) fi @@ -329,13 +355,13 @@ AC_CACHE_CHECK([whether __attribute__ ((weak)) allowed], pac_cv_attr_weak,[ AC_TRY_COMPILE([int foo(int) __attribute__ ((weak));],[int a;], pac_cv_attr_weak=yes,pac_cv_attr_weak=no)]) -# Note that being able to compile with weak_import doesn't mean that +# Note that being able to compile with weak_import doesn't mean that # it works. AC_CACHE_CHECK([whether __attribute__ ((weak_import)) allowed], pac_cv_attr_weak_import,[ AC_TRY_COMPILE([int foo(int) __attribute__ ((weak_import));],[int a;], pac_cv_attr_weak_import=yes,pac_cv_attr_weak_import=no)]) -# Check if the alias option for weak attributes is allowed +# Check if the alias option for weak attributes is allowed AC_CACHE_CHECK([whether __attribute__((weak,alias(...))) allowed], pac_cv_attr_weak_alias,[ AC_TRY_COMPILE([int foo(int) __attribute__((weak,alias("__foo")));],[int a;], @@ -377,11 +403,8 @@ AC_DEFUN([PAC_PROG_C_MULTIPLE_WEAK_SYMBOLS],[ AC_CACHE_CHECK([for multiple weak symbol support], pac_cv_prog_c_multiple_weak_symbols,[ # Test for multiple weak symbol support... -# -# This is needed for Mac OSX 10.5 -rm -rf conftest.dSYM -rm -f conftest* -cat >>conftest1.c <>conftest2.c <>config.log - echo "Failed program was" >>config.log - cat conftest1.c >>config.log - cat conftest2.c >>config.log - if test -s conftest.out ; then cat conftest.out >> config.log ; fi -fi -# This is needed for Mac OSX 10.5 -rm -rf conftest.dSYM -rm -f conftest* +]) dnl ]) if test "$pac_cv_prog_c_multiple_weak_symbols" = "yes" ; then @@ -467,12 +481,24 @@ if test "$enable_strict_done" != "yes" ; then # values, but they are structs of a single basic type (used to enforce # type checking for relative vs. absolute ptrs), and with optimization # the aggregate value is converted to a scalar. + # -Wdeclaration-after-statement -- This is a C89 + # requirement. When compiling with C99, this should be + # disabled. + # -Wfloat-equal -- There are places in hwloc that set a float var to 0, then + # compare it to 0 later to see if it was updated. Also when using strtod() + # one needs to compare the return value with 0 to see whether a conversion + # was performed. + # -Werror-implicit-function-declaration -- implicit function declarations + # should never be tolerated. This also ensures that we get quick + # compilation failures rather than later link failures that usually + # come from a function name typo. # the embedded newlines in this string are safe because we evaluate each # argument in the for-loop below and append them to the CFLAGS with a space # as the separator instead pac_common_strict_flags=" -Wall -Wextra + -Wshorten-64-to-32 -Wno-missing-field-initializers -Wstrict-prototypes -Wmissing-prototypes @@ -482,8 +508,6 @@ if test "$enable_strict_done" != "yes" ; then -Wshadow -Wmissing-declarations -Wno-long-long - -Wfloat-equal - -Wdeclaration-after-statement -Wundef -Wno-endif-labels -Wpointer-arith @@ -501,11 +525,12 @@ if test "$enable_strict_done" != "yes" ; then -Wvariadic-macros -Wno-format-zero-length -Wno-type-limits + -Werror-implicit-function-declaration " enable_c89=yes enable_c99=no - enable_posix=yes + enable_posix=2001 enable_opt=yes flags="`echo $1 | sed -e 's/:/ /g' -e 's/,/ /g'`" for flag in ${flags}; do @@ -518,9 +543,17 @@ if test "$enable_strict_done" != "yes" ; then enable_strict_done="yes" enable_c99=yes ;; - posix) + posix1995) enable_strict_done="yes" - enable_posix=yes + enable_posix=1995 + ;; + posix|posix2001) + enable_strict_done="yes" + enable_posix=2001 + ;; + posix2008) + enable_strict_done="yes" + enable_posix=2008 ;; noposix) enable_strict_done="yes" @@ -537,7 +570,7 @@ if test "$enable_strict_done" != "yes" ; then all|yes) enable_strict_done="yes" enable_c89=yes - enable_posix=yes + enable_posix=2001 enable_opt=yes ;; no) @@ -558,15 +591,20 @@ if test "$enable_strict_done" != "yes" ; then pac_cc_strict_flags="-O2" fi pac_cc_strict_flags="$pac_cc_strict_flags $pac_common_strict_flags" - if test "${enable_posix}" = "yes" ; then - PAC_APPEND_FLAG([-D_POSIX_C_SOURCE=199506L],[pac_cc_strict_flags]) - fi + case "$enable_posix" in + no) : ;; + 1995) PAC_APPEND_FLAG([-D_POSIX_C_SOURCE=199506L],[pac_cc_strict_flags]) ;; + 2001) PAC_APPEND_FLAG([-D_POSIX_C_SOURCE=200112L],[pac_cc_strict_flags]) ;; + 2008) PAC_APPEND_FLAG([-D_POSIX_C_SOURCE=200809L],[pac_cc_strict_flags]) ;; + *) AC_MSG_ERROR([internal error, unexpected POSIX version: '$enable_posix']) ;; + esac # We only allow one of strict-C99 or strict-C89 to be # enabled. If C99 is enabled, we automatically disable C89. if test "${enable_c99}" = "yes" ; then PAC_APPEND_FLAG([-std=c99],[pac_cc_strict_flags]) elif test "${enable_c89}" = "yes" ; then PAC_APPEND_FLAG([-std=c89],[pac_cc_strict_flags]) + PAC_APPEND_FLAG([-Wdeclaration-after-statement],[pac_cc_strict_flags]) fi fi @@ -1228,62 +1266,66 @@ AC_REQUIRE([AC_PROG_RANLIB]) AC_REQUIRE([AC_PROG_INSTALL]) AC_REQUIRE([AC_PROG_CC]) ac_cv_prog_install_breaks_libs=yes -# This is needed for Mac OSX 10.5 -rm -rf conftest.dSYM -rm -f libconftest* conftest* -echo 'int foo(int);int foo(int a){return a;}' > conftest1.c -echo 'extern int foo(int); int main( int argc, char **argv){ return foo(0); }' > conftest2.c -if ${CC-cc} $CFLAGS -c conftest1.c >conftest.out 2>&1 ; then - if ${AR-ar} cr libconftest.a conftest1.o >/dev/null 2>&1 ; then + +AC_COMPILE_IFELSE([ + AC_LANG_SOURCE([ int foo(int); int foo(int a){return a;} ]) +],[ + if ${AR-ar} ${AR_FLAGS-cr} libconftest.a conftest.$OBJEXT >/dev/null 2>&1 ; then if ${RANLIB-:} libconftest.a >/dev/null 2>&1 ; then - # Anything less than sleep 10, and Mac OS/X (Darwin) - # will claim that install works because ranlib won't complain - sleep 10 - libinstall="$INSTALL_DATA" - eval "libinstall=\"$libinstall\"" - if ${libinstall} libconftest.a libconftest1.a >/dev/null 2>&1 ; then - if ${CC-cc} $CFLAGS -o conftest conftest2.c $LDFLAGS libconftest1.a >>conftest.out 2>&1 && test -x conftest ; then - # Success! Install works - ac_cv_prog_install_breaks_libs=no - else - # Failure! Does install -p work? - rm -f libconftest1.a - if ${libinstall} -p libconftest.a libconftest1.a >/dev/null 2>&1 ; then - if ${CC-cc} $CFLAGS -o conftest conftest2.c $LDFLAGS libconftest1.a >>conftest.out 2>&1 && test -x conftest ; then - # Success! Install works - ac_cv_prog_install_breaks_libs="no, with -p" - fi - fi - fi + # Anything less than sleep 10, and Mac OS/X (Darwin) + # will claim that install works because ranlib won't complain + sleep 10 + libinstall="$INSTALL_DATA" + eval "libinstall=\"$libinstall\"" + if ${libinstall} libconftest.a libconftest1.a >/dev/null 2>&1 ; then + saved_LIBS="$LIBS" + LIBS="libconftest1.a" + AC_LINK_IFELSE([ + AC_LANG_SOURCE([ +extern int foo(int); +int main(int argc, char **argv){ return foo(0); } + ]) + ],[ + # Success! Install works + ac_cv_prog_install_breaks_libs=no + ],[ + # Failure! Does install -p work? + rm -f libconftest1.a + if ${libinstall} -p libconftest.a libconftest1.a >/dev/null 2>&1 ; then + AC_LINK_IFELSE([],[ + # Success! Install works + ac_cv_prog_install_breaks_libs="no, with -p" + ]) + fi + ]) + LIBS="$saved_LIBS" fi fi fi -fi -# This is needed for Mac OSX 10.5 -rm -rf conftest.dSYM -rm -f conftest* libconftest*]) +]) +rm -f libconftest*.a +]) dnl Endof ac_cache_check if test -z "$RANLIB_AFTER_INSTALL" ; then RANLIB_AFTER_INSTALL=no fi case "$ac_cv_prog_install_breaks_libs" in - yes) - RANLIB_AFTER_INSTALL=yes - ;; - "no, with -p") - INSTALL_DATA="$INSTALL_DATA -p" - ;; - *) - # Do nothing - : - ;; + yes) + RANLIB_AFTER_INSTALL=yes + ;; + "no, with -p") + INSTALL_DATA="$INSTALL_DATA -p" + ;; + *) + # Do nothing + : + ;; esac AC_SUBST(RANLIB_AFTER_INSTALL) ]) # # determine if the compiler defines a symbol containing the function name -# Inspired by checks within the src/mpid/globus/configure.in file in MPICH2 # # These tests check not only that the compiler defines some symbol, such # as __FUNCTION__, but that the symbol correctly names the function. diff --git a/ompi/mca/io/romio/romio/confdb/aclocal_coverage.m4 b/ompi/mca/io/romio/romio/confdb/aclocal_coverage.m4 new file mode 100644 index 0000000000..6e982954dc --- /dev/null +++ b/ompi/mca/io/romio/romio/confdb/aclocal_coverage.m4 @@ -0,0 +1,86 @@ + +dnl Macro to add --enable-coverage option (disabled by default) and add +dnl appropriate compiler flags to permit usage of gcov if that option is +dnl enabled. If WRAPPER_xFLAGS variables are set then the flags will also be +dnl added to those variables. +dnl +dnl Sets "pac_cv_use_coverage=yes" and AC_DEFINEs USE_COVERAGE if coverage was +dnl successfully enabled. Also creates an AM_CONDITIONAL with the name +dnl "BUILD_COVERAGE" that is true iff pac_cv_use_coverage=yes. +dnl +dnl Usage: PAC_CONFIG_SUBDIR_ARGS +dnl +dnl Assumes that all of the compiler macros have already been invoked +dnl (AC_PROG_CC and friends). +AC_DEFUN([PAC_ENABLE_COVERAGE],[ + +AC_ARG_VAR([GCOV],[name/path for the gcov utility]) +AC_CHECK_PROGS([GCOV],[gcov]) + +AC_ARG_ENABLE([coverage], + [AC_HELP_STRING([--enable-coverage], + [Turn on coverage analysis using gcc and gcov])], + [],[enable_coverage=no]) + +if test "$enable_coverage" = "yes" ; then + if test "$ac_cv_prog_gcc" = "yes" ; then + CFLAGS="$CFLAGS -fprofile-arcs -ftest-coverage" + if test ${WRAPPER_CFLAGS+set} = set ; then + WRAPPER_CFLAGS="$WRAPPER_CFLAGS -fprofile-arcs -ftest-coverage" + fi + else + AC_MSG_WARN([--enable-coverage only supported for GCC]) + fi + if test "$enable_cxx" = "yes" ; then + if test "$ac_cv_cxx_compiler_gnu" = "yes" ; then + CXXFLAGS="$CXXFLAGS -fprofile-arcs -ftest-coverage" + if test ${WRAPPER_CXXFLAGS+set} = set ; then + WRAPPER_CXXFLAGS="$WRAPPER_CXXFLAGS -fprofile-arcs -ftest-coverage" + fi + else + AC_MSG_WARN([--enable-coverage only supported for GCC]) + fi + fi + # Add similar options for g77 so that the Fortran tests will also + # + if test "$enable_f77" = yes ; then + if test "$ac_cv_f77_compiler_gnu" = "yes" ; then + FFLAGS="$FFLAGS -fprofile-arcs -ftest-coverage" + if test ${WRAPPER_FFLAGS+set} = set ; then + WRAPPER_FFLAGS="$WRAPPER_FFLAGS -fprofile-arcs -ftest-coverage" + fi + else + AC_MSG_WARN([--enable-coverage only supported for G77/GFORTRAN]) + fi + fi + if test "$enable_fc" = yes ; then + if test "$ac_cv_fc_compiler_gnu" = "yes" ; then + FCFLAGS="$FCFLAGS -fprofile-arcs -ftest-coverage" + if test ${WRAPPER_FCFLAGS+set} = set ; then + WRAPPER_FCFLAGS="$WRAPPER_FCFLAGS -fprofile-arcs -ftest-coverage" + fi + else + AC_MSG_WARN([--enable-coverage only supported for GFORTRAN]) + fi + fi + # On some platforms (e.g., Mac Darwin), we must also *link* + # with the -fprofile-args -ftest-coverage option. + AC_MSG_CHECKING([whether compilation with coverage analysis enabled works]) + AC_LINK_IFELSE([AC_LANG_SOURCE([int main(int argc, char **argv){return 1;}])], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + AC_MSG_ERROR([Unable to link programs when coverage analysis enabled])]) + + # Test for the routines that we need to use to ensure that the + # data files are (usually) written out + # FIXME: Some versions of Linux provide usleep, but it rounds times + # up to the next second (!) + AC_CHECK_FUNCS([usleep]) + + # NOTE: using a "pac_cv_" prefix but not caching because of xFLAGS "side effects" + pac_cv_use_coverage=yes + AC_DEFINE([USE_COVERAGE],[1],[Define if performing coverage tests]) +fi +AM_CONDITIONAL([BUILD_COVERAGE],[test "X$pac_cv_use_coverage" = "Xyes"]) +]) + diff --git a/ompi/mca/io/romio/romio/confdb/aclocal_cxx.m4 b/ompi/mca/io/romio/romio/confdb/aclocal_cxx.m4 index c43b64f0ab..279b668852 100644 --- a/ompi/mca/io/romio/romio/confdb/aclocal_cxx.m4 +++ b/ompi/mca/io/romio/romio/confdb/aclocal_cxx.m4 @@ -1,14 +1,26 @@ +dnl PAC_CXX_SEARCH_LIST - expands to a whitespace separated list of C++ +dnl compilers for use with AC_PROG_CXX that is more suitable for HPC software +dnl packages +AC_DEFUN([PAC_CXX_SEARCH_LIST],[$CCC icpc pgCC xlC pathCC c++ cxx CC g++ clang++ gcc cc++ cl]) dnl PAC_PROG_CXX - reprioritize the C++ compiler search order +dnl NOTE: this macro suffers from a basically intractable "expanded before it +dnl was required" problem when libtool is also used AC_DEFUN([PAC_PROG_CXX],[ PAC_PUSH_FLAG([CXXFLAGS]) - AC_PROG_CXX([g++ icpc pgCC xlC pathCC cl]) + # This test uses the list from a recent PROG_CXX, but with the + # addition of the Portland group, IBM, and Intel C++ compilers + # (While the Intel icc compiler will compile C++ programs, it will + # not *link* C++ object files unless there is at least one C++ source + # file present on the command that performs the linking. icpc is the + # Intel C++ compiler that both compiles and links C++ programs) + AC_PROG_CXX([PAC_CXX_SEARCH_LIST]) PAC_POP_FLAG([CXXFLAGS]) ]) dnl This is from crypt.to/autoconf-archive, slightly modified. dnl It defines bool as int if it is not availalbe dnl -AC_DEFUN([AC_CXX_BOOL], +AC_DEFUN([AX_CXX_BOOL], [AC_CACHE_CHECK(whether the compiler recognizes bool as a built-in type, ac_cv_cxx_bool, [AC_LANG_SAVE @@ -28,7 +40,7 @@ fi dnl This is from crypt.to/autoconf-archive, slightly modified (name defined) dnl -AC_DEFUN([AC_CXX_EXCEPTIONS], +AC_DEFUN([AX_CXX_EXCEPTIONS], [AC_CACHE_CHECK(whether the compiler supports exceptions, ac_cv_cxx_exceptions, [AC_LANG_SAVE @@ -44,7 +56,7 @@ fi dnl This is from crypt.to/autoconf-archive dnl -AC_DEFUN([AC_CXX_NAMESPACES], +AC_DEFUN([AX_CXX_NAMESPACES], [AC_CACHE_CHECK(whether the compiler implements namespaces, ac_cv_cxx_namespaces, [AC_LANG_SAVE @@ -61,8 +73,8 @@ fi dnl Some compilers support namespaces but don't know about std dnl -AC_DEFUN([AC_CXX_NAMESPACE_STD], -[AC_REQUIRE([AC_CXX_NAMESPACES]) +AC_DEFUN([AX_CXX_NAMESPACE_STD], +[AC_REQUIRE([AX_CXX_NAMESPACES]) AC_CACHE_CHECK(whether the compiler implements the namespace std, ac_cv_cxx_namespace_std, [ac_cv_cxx_namespace_std=no @@ -105,70 +117,71 @@ dnl variable containing the option name as the first argument. dnl D*/ AC_DEFUN([PAC_CXX_CHECK_COMPILER_OPTION],[ AC_MSG_CHECKING([whether C++ compiler accepts option $1]) -save_CXXFLAGS="$CXXFLAGS" -CXXFLAGS="$1 $CXXFLAGS" -rm -f conftest.out -echo 'int foo(void);int foo(void){return 0;}' > conftest2.cpp -echo 'int main(void);int main(void){return 0;}' > conftest.cpp -if ${CXX-g++} $save_CXXFLAGS $CPPFLAGS -o conftest conftest.cpp $LDFLAGS >conftest.bas 2>&1 ; then - if ${CXX-g++} $CXXFLAGS $CPPFLAGS -o conftest conftest.cpp $LDFLAGS >conftest.out 2>&1 ; then - if diff -b conftest.out conftest.bas >/dev/null 2>&1 ; then - AC_MSG_RESULT(yes) - AC_MSG_CHECKING([whether routines compiled with $1 can be linked with ones compiled without $1]) - rm -f conftest.out - rm -f conftest.bas - if ${CXX-g++} -c $save_CXXFLAGS $CPPFLAGS conftest2.cpp >conftest2.out 2>&1 ; then - if ${CXX-g++} $CXXFLAGS $CPPFLAGS -o conftest conftest2.o conftest.cpp $LDFLAGS >conftest.bas 2>&1 ; then - if ${CXX-g++} $CXXFLAGS $CPPFLAGS -o conftest conftest2.o conftest.cpp $LDFLAGS >conftest.out 2>&1 ; then - if diff -b conftest.out conftest.bas >/dev/null 2>&1 ; then - AC_MSG_RESULT(yes) - CXXFLAGS="$save_CXXFLAGS" - ifelse($2,,CXXOPTIONS="$CXXOPTIONS $1",$2) - elif test -s conftest.out ; then - cat conftest.out >&AC_FD_CC - AC_MSG_RESULT(no) - CXXFLAGS="$save_CXXFLAGS" - $3 - else - AC_MSG_RESULT(no) - CXXFLAGS="$save_CXXFLAGS" - $3 - fi - else - if test -s conftest.out ; then - cat conftest.out >&AC_FD_CC - fi - AC_MSG_RESULT(no) - CXXFLAGS="$save_CXXFLAGS" - $3 - fi - else - # Could not link with the option! - AC_MSG_RESULT(no) - fi - else - if test -s conftest2.out ; then - cat conftest2.out >&AC_FD_CC - fi - AC_MSG_RESULT(no) - CXXFLAGS="$save_CXXFLAGS" - $3 - fi - else - cat conftest.out >&AC_FD_CC - AC_MSG_RESULT(no) - $3 - CXXFLAGS="$save_CXXFLAGS" - fi - else - AC_MSG_RESULT(no) - $3 - if test -s conftest.out ; then cat conftest.out >&AC_FD_CC ; fi - CXXFLAGS="$save_CXXFLAGS" - fi -else - # Could not compile without the option! - AC_MSG_RESULT(no) -fi -rm -f conftest* +pac_opt="$1" +AC_LANG_PUSH([C++]) +CXXFLAGS_orig="$CXXFLAGS" +CXXFLAGS_opt="$pac_opt $CXXFLAGS" +pac_result="unknown" + +AC_LANG_CONFTEST([AC_LANG_PROGRAM()]) +CXXFLAGS="$CXXFLAGS_orig" +rm -f pac_test1.log +PAC_LINK_IFELSE_LOG([pac_test1.log], [], [ + CXXFLAGS="$CXXFLAGS_opt" + rm -f pac_test2.log + PAC_LINK_IFELSE_LOG([pac_test2.log], [], [ + PAC_RUNLOG_IFELSE([diff -b pac_test1.log pac_test2.log], + [pac_result=yes],[pac_result=no]) + ],[ + pac_result=no + ]) +], [ + pac_result=no +]) +AC_MSG_RESULT([$pac_result]) +dnl Delete the conftest created by AC_LANG_CONFTEST. +rm -f conftest.$ac_ext + +if test "$pac_result" = "yes" ; then + AC_MSG_CHECKING([whether routines compiled with $pac_opt can be linked with ones compiled without $pac_opt]) + pac_result=unknown + CXXFLAGS="$CXXFLAGS_orig" + rm -f pac_test3.log + PAC_COMPILE_IFELSE_LOG([pac_test3.log], [ + AC_LANG_SOURCE([ + int foo(void); + int foo(void){return 0;} + ]) + ],[ + PAC_RUNLOG([mv conftest.$OBJEXT pac_conftest.$OBJEXT]) + saved_LIBS="$LIBS" + LIBS="pac_conftest.$OBJEXT $LIBS" + + CXXFLAGS="$CXXFLAGS_opt" + rm -f pac_test4.log + PAC_LINK_IFELSE_LOG([pac_test4.log], [AC_LANG_PROGRAM()], [ + PAC_RUNLOG_IFELSE([diff -b pac_test2.log pac_test4.log], + [pac_result=yes], [pac_result=no]) + ],[ + pac_result=no + ]) + LIBS="$saved_LIBS" + rm -f pac_conftest.$OBJEXT + ],[ + pac_result=no + ]) + AC_MSG_RESULT([$pac_result]) + rm -f pac_test3.log pac_test4.log +fi +rm -f pac_test1.log pac_test2.log + +dnl Restore CXXFLAGS before 2nd/3rd argument commands are executed, +dnl as 2nd/3rd argument command could be modifying CXXFLAGS. +CXXFLAGS="$CXXFLAGS_orig" +if test "$pac_result" = "yes" ; then + ifelse([$2],[],[CXXOPTIONS="$CXXOPTIONS $1"],[$2]) +else + ifelse([$3],[],[:],[$3]) +fi +AC_LANG_POP([C++]) ]) diff --git a/ompi/mca/io/romio/romio/confdb/aclocal_f77.m4 b/ompi/mca/io/romio/romio/confdb/aclocal_f77.m4 index 46bd25e2e0..1895a33033 100644 --- a/ompi/mca/io/romio/romio/confdb/aclocal_f77.m4 +++ b/ompi/mca/io/romio/romio/confdb/aclocal_f77.m4 @@ -1,10 +1,15 @@ +dnl PAC_F77_SEARCH_LIST - expands to a whitespace separated list of fortran 77 +dnl compilers for use with AC_PROG_F77 that is more suitable for HPC software +dnl packages +AC_DEFUN([PAC_F77_SEARCH_LIST],[ifort pgf77 af77 xlf frt cf77 fort77 fl32 fort ifc efc ftn gfortran f77 g77]) dnl PAC_PROG_F77 - reprioritize the F77 compiler search order +dnl NOTE: this macro suffers from a basically intractable "expanded before it +dnl was required" problem when libtool is also used AC_DEFUN([PAC_PROG_F77],[ PAC_PUSH_FLAG([FFLAGS]) -AC_PROG_F77([ifort pgf77 af77 xlf frt cf77 fort77 fl32 fort ifc efc ftn gfortran f77 g77]) +AC_PROG_F77([PAC_F77_SEARCH_LIST]) PAC_POP_FLAG([FFLAGS]) ]) - dnl dnl/*D dnl PAC_PROG_F77_NAME_MANGLE - Determine how the Fortran compiler mangles @@ -46,240 +51,149 @@ dnl dnl D*/ dnl AC_DEFUN([PAC_PROG_F77_NAME_MANGLE],[ +AC_REQUIRE([AC_F77_LIBRARY_LDFLAGS]) AC_CACHE_CHECK([for Fortran 77 name mangling], -pac_cv_prog_f77_name_mangle, -[ - # Check for strange behavior of Fortran. For example, some FreeBSD - # systems use f2c to implement f77, and the version of f2c that they - # use generates TWO (!!!) trailing underscores - # Currently, WDEF is not used but could be... - # - # Eventually, we want to be able to override the choices here and - # force a particular form. This is particularly useful in systems - # where a Fortran compiler option is used to force a particular - # external name format (rs6000 xlf, for example). - # This is needed for Mac OSX 10.5 - rm -rf conftest.dSYM - rm -f conftest* - cat > conftest.f <&AC_FD_CC - cat conftest.f >&AC_FD_CC - fi - - AC_LANG_SAVE - AC_LANG_C - save_LIBS="$LIBS" - dnl FLIBS comes from AC_F77_LIBRARY_LDFLAGS - LIBS="fconftestf.o $FLIBS $LIBS" - AC_TRY_LINK([extern void my_name(int);],my_name(0);,pac_cv_prog_f77_name_mangle="lower") - if test "X$pac_cv_prog_f77_name_mangle" = "X" ; then - AC_TRY_LINK([extern void my_name_(int);],my_name_(0);,pac_cv_prog_f77_name_mangle="lower underscore") - fi - if test "X$pac_cv_prog_f77_name_mangle" = "X" ; then - AC_TRY_LINK([void __stdcall MY_NAME(int);],MY_NAME(0);,pac_cv_prog_f77_name_mangle="upper stdcall") - fi - if test "X$pac_cv_prog_f77_name_mangle" = "X" ; then - AC_TRY_LINK([extern void MY_NAME(int);],MY_NAME(0);,pac_cv_prog_f77_name_mangle="upper") - fi - if test "X$pac_cv_prog_f77_name_mangle" = "X" ; then - AC_TRY_LINK([extern void my_name__(int);],my_name__(0);, - pac_cv_prog_f77_name_mangle="lower doubleunderscore") - fi - if test "X$pac_cv_prog_f77_name_mangle" = "X" ; then - AC_TRY_LINK([extern void MY_name(int);],MY_name(0);,pac_cv_prog_f77_name_mangle="mixed") - fi - if test "X$pac_cv_prog_f77_name_mangle" = "X" ; then - AC_TRY_LINK([extern void MY_name_(int);],MY_name_(0);,pac_cv_prog_f77_name_mangle="mixed underscore") - fi - LIBS="$save_LIBS" - AC_LANG_RESTORE - # If we got to this point, it may be that the programs have to be - # linked with the Fortran, not the C, compiler. Try reversing - # the language used for the test - dnl Note that the definition of AC_TRY_LINK and AC_LANG_PROGRAM - dnl is broken in autoconf and will generate spurious warning messages - dnl To fix this, we use - dnl AC _LINK_IFELSE([AC _LANG_PROGRAM(,[[body]])],action-if-true) - dnl instead of AC _TRY_LINK(,body,action-if-true) - if test "X$pac_cv_prog_f77_name_mangle" = "X" ; then - AC_LANG_SAVE - AC_LANG_FORTRAN77 - save_LIBS="$LIBS" - LIBS="conftestc.o $LIBS" - if test "X$ac_ccompile" = "X" ; then - ac_ccompile='${CC-cc} -c $CFLAGS conftest.c 1>&AC_FD_CC' - fi - # This is needed for Mac OSX 10.5 - rm -rf conftest.dSYM - rm -f conftest* - cat > conftest.c <&AC_FD_CC - cat conftest.c >&AC_FD_CC - fi - - AC_LINK_IFELSE([AC_LANG_PROGRAM(,[[ call my_name(0)]])], - pac_cv_prog_f77_name_mangle="lower") - - if test "X$pac_cv_prog_f77_name_mangle" = "X" ; then - # This is needed for Mac OSX 10.5 - rm -rf conftest.dSYM - rm -f conftest* - cat > conftest.c <&AC_FD_CC - cat conftest.c >&AC_FD_CC - fi - AC_LINK_IFELSE([AC_LANG_PROGRAM(,[[ call my_name(0)]])], - pac_cv_prog_f77_name_mangle="lower underscore") - fi - if test "X$pac_cv_prog_f77_name_mangle" = "X" ; then - # This is needed for Mac OSX 10.5 - rm -rf conftest.dSYM - rm -f conftest* - cat >conftest.c <&AC_FD_CC - cat conftest.c >&AC_FD_CC - fi - AC_LINK_IFELSE([AC_LANG_PROGRAM(,[[ call my_name(0)]])], - pac_cv_prog_f77_name_mangle="upper stdcall") - fi - if test "X$pac_cv_prog_f77_name_mangle" = "X" ; then - # This is needed for Mac OSX 10.5 - rm -rf conftest.dSYM - rm -f conftest* - cat >conftest.c <&AC_FD_CC - cat conftest.c >&AC_FD_CC - fi - AC_LINK_IFELSE([AC_LANG_PROGRAM(,[[ call MY_NAME(0)]])], - pac_cv_prog_f77_name_mangle="upper") - fi - if test "X$pac_cv_prog_f77_name_mangle" = "X" ; then - # This is needed for Mac OSX 10.5 - rm -rf conftest.dSYM - rm -f conftest* - cat >conftest.c <&AC_FD_CC - cat conftest.c >&AC_FD_CC - fi - AC_LINK_IFELSE([AC_LANG_PROGRAM(,[[ call my_name(0)]])], - pac_cv_prog_f77_name_mangle="lower doubleunderscore") - fi - if test "X$pac_cv_prog_f77_name_mangle" = "X" ; then - # This is needed for Mac OSX 10.5 - rm -rf conftest.dSYM - rm -f conftest* - cat >conftest.c <&AC_FD_CC - cat conftest.c >&AC_FD_CC - fi - AC_LINK_IFELSE([AC_LANG_PROGRAM(,[[ call MY_name(0)]])], - pac_cv_prog_f77_name_mangle="mixed") - fi - if test "X$pac_cv_prog_f77_name_mangle" = "X" ; then - # This is needed for Mac OSX 10.5 - rm -rf conftest.dSYM - rm -f conftest* - cat >conftest.c <&AC_FD_CC - cat conftest.c >&AC_FD_CC - fi - AC_LINK_IFELSE([AC_LANG_PROGRAM(,[[ call MY_name(0)]])], - pac_cv_prog_f77_name_mangle="mixed underscore") - fi - LIBS="$save_LIBS" - AC_LANG_RESTORE - fi - # This is needed for Mac OSX 10.5 - rm -rf conftest.dSYM - rm -f fconftest* +pac_cv_prog_f77_name_mangle,[ +# Initialize pac_found to indicate if name mangling scheme has been found +pac_found=no +AC_LANG_PUSH([Fortran 77]) +AC_COMPILE_IFELSE([ + AC_LANG_SOURCE([ + subroutine MY_name( ii ) + return + end + ]) +],[ + PAC_RUNLOG([mv conftest.$OBJEXT f77conftest.$OBJEXT]) + saved_LIBS="$LIBS" + dnl FLIBS is set by AC_F77_LIBRARY_LDFLAGS + LIBS="f77conftest.$OBJEXT $FLIBS $LIBS" + AC_LANG_PUSH([C]) + for call in "" __stdcall ; do + for sym in my_name_ my_name__ my_name MY_NAME MY_name MY_name_ NONE ; do + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([extern void ${call} ${sym}(int);],[${sym}(0);]) + ],[ + pac_found=yes + break + ]) + done + test "$pac_found" = "yes" && break + done + AC_LANG_POP([C]) + LIBS="$saved_LIBS" + rm -f f77conftest.$OBJEXT ]) -# Make the actual definition -pac_namecheck=`echo X$pac_cv_prog_f77_name_mangle | sed 's/ /-/g'` -ifelse([$1],,[ -pac_cv_test_stdcall="" -case $pac_namecheck in - X) AC_MSG_WARN([Cannot determine Fortran naming scheme]) ;; - Xlower) AC_DEFINE(F77_NAME_LOWER,1,[Define if Fortran names are lowercase]) - F77_NAME_MANGLE="F77_NAME_LOWER" - ;; - Xlower-underscore) AC_DEFINE(F77_NAME_LOWER_USCORE,1,[Define if Fortran names are lowercase with a trailing underscore]) - F77_NAME_MANGLE="F77_NAME_LOWER_USCORE" - ;; - Xlower-doubleunderscore) AC_DEFINE(F77_NAME_LOWER_2USCORE,1,[Define if Fortran names containing an underscore have two trailing underscores]) - F77_NAME_MANGLE="F77_NAME_LOWER_2USCORE" - ;; - Xupper) AC_DEFINE(F77_NAME_UPPER,1,[Define if Fortran names are uppercase]) - F77_NAME_MANGLE="F77_NAME_UPPER" - ;; - Xmixed) AC_DEFINE(F77_NAME_MIXED,1,[Define if Fortran names preserve the original case]) - F77_NAME_MANGLE="F77_NAME_MIXED" - ;; - Xmixed-underscore) AC_DEFINE(F77_NAME_MIXED_USCORE,1,[Define if Fortran names preserve the original case and add a trailing underscore]) - F77_NAME_MANGLE="F77_NAME_MIXED_USCORE" - ;; - Xupper-stdcall) AC_DEFINE(F77_NAME_UPPER,1,[Define if Fortran names are uppercase]) - F77_NAME_MANGLE="F77_NAME_UPPER_STDCALL" - pac_cv_test_stdcall="__stdcall" - ;; - *) AC_MSG_WARN([Unknown Fortran naming scheme]) ;; +AC_LANG_POP([Fortran 77]) +dnl +# If we got to here and pac_cv_prog_f77_name_mangle is still NOT definable, +# it may be that the programs have to be linked with the Fortran compiler, +# not the C compiler. Try reversing the language used for the test +if test "$pac_found" != "yes" ; then + AC_LANG_PUSH([C]) + for call in "" __stdcall ; do + for sym in my_name_ my_name__ my_name MY_NAME MY_name MY_name_ NONE ; do + AC_COMPILE_IFELSE([ + AC_LANG_SOURCE([void ${call} ${sym}(int a) {}]) + ],[ + PAC_RUNLOG([mv conftest.$OBJEXT cconftest.$OBJEXT]) + saved_LIBS="$LIBS" + LIBS="cconftest.$OBJEXT $LIBS" + AC_LANG_PUSH([Fortran 77]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([],[ call my_name(0)]) + ],[ + pac_found=yes + ]) + AC_LANG_POP([Fortran 77]) + LIBS="$saved_LIBS" + rm -f cconftest.$OBJEXT + test "$pac_found" = "yes" && break + ]) + done + test "$pac_found" = "yes" && break + done + AC_LANG_POP([C]) +fi +if test "$pac_found" = "yes" ; then + case ${sym} in + my_name_) + pac_cv_prog_f77_name_mangle="lower uscore" ;; + my_name__) + pac_cv_prog_f77_name_mangle="lower 2uscore" ;; + my_name) + pac_cv_prog_f77_name_mangle="lower" ;; + MY_NAME) + pac_cv_prog_f77_name_mangle="upper" ;; + MY_name) + pac_cv_prog_f77_name_mangle="mixed" ;; + MY_name_) + pac_cv_prog_f77_name_mangle="mixed uscore" ;; + *) + pac_cv_prog_f77_name_mangle="" + pac_found=no; + ;; + esac + if test "X$pac_cv_prog_f77_name_mangle" != "X" ; then + if test "$call" = "__stdcall" ; then + pac_cv_prog_f77_name_mangle="$pac_cv_prog_f77_name_mangle stdcall" + fi + fi +fi +]) +dnl Endof ac_cache_check +case $pac_cv_prog_f77_name_mangle in + *stdcall) + F77_STDCALL="__stdcall" ;; + *) + F77_STDCALL="" ;; esac -AC_SUBST(F77_NAME_MANGLE) # Get the standard call definition # FIXME: This should use F77_STDCALL, not STDCALL (non-conforming name) -if test "X$pac_cv_test_stdcall" = "X" ; then - F77_STDCALL="" -else - F77_STDCALL="__stdcall" +F77_STDCALL="$call" +AC_DEFINE_UNQUOTED(STDCALL,[$F77_STDCALL],[Define calling convention]) + +# new_name="`echo $name | tr ' ' '_' | tr [a-z] [A-Z]`" +# We could have done the character conversion with 'tr' +# which may not be portable, e.g. solaris's /usr/ucb/bin/tr. +# So use a conservative approach. + +# Replace blank with underscore +name_scheme="`echo $pac_cv_prog_f77_name_mangle | sed 's% %_%g'`" +# Turn lowercase into uppercase. +name_scheme="`echo $name_scheme | sed -e 'y%abcdefghijklmnopqrstuvwxyz%ABCDEFGHIJKLMNOPQRSTUVWXYZ%'`" +F77_NAME_MANGLE="F77_NAME_${name_scheme}" +AC_DEFINE_UNQUOTED([$F77_NAME_MANGLE]) +AC_SUBST(F77_NAME_MANGLE) +if test "X$pac_cv_prog_f77_name_mangle" = "X" ; then + AC_MSG_WARN([Unknown Fortran naming scheme]) fi -# -AC_DEFINE_UNQUOTED(STDCALL,$F77_STDCALL,[Define calling convention]) -],[$1]) +dnl +dnl Define the macros that is needed by AC_DEFINE_UNQUOTED([$F77_NAME_MANGLE]) +AH_TEMPLATE([F77_NAME_LOWER], + [Fortran names are lowercase with no trailing underscore]) +AH_TEMPLATE([F77_NAME_LOWER_USCORE], + [Fortran names are lowercase with one trailing underscore]) +AH_TEMPLATE([F77_NAME_LOWER_2USCORE], + [Fortran names are lowercase with two trailing underscores]) +AH_TEMPLATE([F77_NAME_MIXED], + [Fortran names preserve the original case]) +AH_TEMPLATE([F77_NAME_MIXED_USCORE], + [Fortran names preserve the original case with one trailing underscore]) +AH_TEMPLATE([F77_NAME_UPPER], + [Fortran names are uppercase]) +AH_TEMPLATE([F77_NAME_LOWER_STDCALL], + [Fortran names are lowercase with no trailing underscore in stdcall]) +AH_TEMPLATE([F77_NAME_LOWER_USCORE_STDCALL], + [Fortran names are lowercase with one trailing underscore in stdcall]) +AH_TEMPLATE([F77_NAME_LOWER_2USCORE_STDCALL], + [Fortran names are lowercase with two trailing underscores in stdcall]) +AH_TEMPLATE([F77_NAME_MIXED_STDCALL], + [Fortran names preserve the original case in stdcall]) +AH_TEMPLATE([F77_NAME_MIXED_USCORE_STDCALL], + [Fortran names preserve the original case with one trailing underscore in stdcall]) +AH_TEMPLATE([F77_NAME_UPPER_STDCALL], + [Fortran names are uppercase in stdcall]) ]) dnl dnl/*D @@ -307,35 +221,37 @@ dnl message. You can use '0' to specify undetermined. dnl dnl D*/ AC_DEFUN([PAC_PROG_F77_CHECK_SIZEOF],[ +AC_REQUIRE([AC_HEADER_STDC]) +AC_REQUIRE([AC_F77_LIBRARY_LDFLAGS]) changequote(<<, >>)dnl dnl The name to #define. -dnl If the arg value contains a variable, we need to update that +dnl dnl If the arg value contains a variable, we need to update that define(<>, translit(sizeof_f77_$1, [a-z *], [A-Z__]))dnl dnl The cache variable name. define(<>, translit(pac_cv_f77_sizeof_$1, [ *], [__]))dnl changequote([, ])dnl AC_CACHE_CHECK([for size of Fortran type $1],PAC_CV_NAME,[ AC_REQUIRE([PAC_PROG_F77_NAME_MANGLE]) -# This is needed for Mac OSX 10.5 -rm -rf conftest.dSYM -rm -f conftest* -cat < conftest.f - subroutine isize( ) - $1 i(2) - call cisize( i(1), i(2) ) - end -EOF -if test "X$ac_fcompile" = "X" ; then - ac_fcompile='${F77-f77} -c $FFLAGS conftest.f 1>&AC_FD_CC' -fi -if AC_TRY_EVAL(ac_fcompile) && test -s conftest.o ; then - mv conftest.o conftestf.o - AC_LANG_SAVE - AC_LANG_C - save_LIBS="$LIBS" - dnl Add the Fortran linking libraries - LIBS="conftestf.o $FLIBS $LIBS" - AC_TRY_RUN([#include +AC_LANG_PUSH([Fortran 77]) +AC_COMPILE_IFELSE([ + AC_LANG_SOURCE([ + subroutine isize() + $1 i(2) + call cisize( i(1), i(2) ) + end + ]) +],[ + # pac_f77compile_ok=yes + PAC_RUNLOG([mv conftest.$OBJEXT pac_f77conftest.$OBJEXT]) + # Save original LIBS, prepend previously generated object file to LIBS + saved_LIBS="$LIBS" + LIBS="pac_f77conftest.$OBJEXT $FLIBS $LIBS" + AC_LANG_PUSH([C]) + AC_RUN_IFELSE([ + AC_LANG_PROGRAM([ +#if defined(HAVE_STDIO_H) || defined(STDC_HEADERS) +#include +#endif #ifdef F77_NAME_UPPER #define cisize_ CISIZE #define isize_ ISIZE @@ -350,29 +266,36 @@ void cisize_(char *i1p, char *i2p) { isize_val = (int)(i2p - i1p); } -int main(int argc, char **argv) -{ + ],[ FILE *f = fopen("conftestval", "w"); if (!f) return 1; isize_(); - fprintf(f,"%d\n", isize_val ); - return 0; -}], eval PAC_CV_NAME=`cat conftestval`,eval PAC_CV_NAME=0, -ifelse([$2],,,eval PAC_CV_NAME=$2)) - # Problem. If the process fails to run, then there won't be - # a good error message. For example, with one Portland Group - # installation, we had problems with finding the libpgc.so shared library - # The autoconf code for TRY_RUN doesn't capture the output from - # the test program (!) - - LIBS="$save_LIBS" - AC_LANG_RESTORE -else - echo "configure: failed program was:" >&AC_FD_CC - cat conftest.f >&AC_FD_CC + fprintf(f,"%d\n", isize_val); + ]) + dnl Endof ac_lang_program + ],[ + eval PAC_CV_NAME=`cat conftestval` + ],[ + eval PAC_CV_NAME=0 + ],[ + # Use -9999 as value to emit a warning message after the cache_check. + ifelse([$2],[],[eval PAC_CV_NAME=-9999],[eval PAC_CV_NAME=$2]) + ]) + dnl Endof ac_run_ifelse + AC_LANG_POP([C]) + LIBS="$saved_LIBS" + # remove previously generated object file. + rm -f pac_f77conftest.$OBJEXT +],[ + # pac_f77compile_ok=no ifelse([$2],,eval PAC_CV_NAME=0,eval PAC_CV_NAME=$2) -fi +]) Endof ac_compile_ifelse +AC_LANG_POP([Fortran 77]) ]) +dnl Endof ac_cache_check +if test "$PAC_CV_NAME" = "-9999" ; then + AC_MSG_WARN([No value provided for size of $1 when cross-compiling]) +fi AC_DEFINE_UNQUOTED(PAC_TYPE_NAME,$PAC_CV_NAME,[Define size of PAC_TYPE_NAME]) undefine([PAC_TYPE_NAME]) undefine([PAC_CV_NAME]) @@ -392,17 +315,19 @@ dnl The cache variable name. define(<>, translit(pac_cv_f77_sizeof_$1, [ *], [__]))dnl changequote([,])dnl AC_CACHE_CHECK([for size of Fortran type $1],PAC_CV_NAME,[ +AC_REQUIRE([AC_HEADER_STDC]) AC_REQUIRE([PAC_PROG_F77_NAME_MANGLE]) -if test "$cross_compiling" = yes ; then - ifelse([$2],,[AC_MSG_WARN([No value provided for size of $1 when cross-compiling])] -,eval PAC_CV_NAME=$2) -else - # This is needed for Mac OSX 10.5 - rm -rf conftest.dSYM - rm -f conftest* - cat < conftestc.c +dnl if test "$cross_compiling" = yes ; then +dnl ifelse([$2],[], +dnl [AC_MSG_WARN([No value provided for size of $1 when cross-compiling])], +dnl [eval PAC_CV_NAME=$2]) +dnl fi +AC_LANG_PUSH([C]) +AC_COMPILE_IFELSE([ + AC_LANG_SOURCE([ +#if defined(HAVE_STDIO_H) || defined(STDC_HEADERS) #include -#include "confdefs.h" +#endif #ifdef F77_NAME_UPPER #define cisize_ CISIZE #define isize_ ISIZE @@ -411,62 +336,53 @@ else #define isize_ isize #endif int cisize_(char *,char*); -int cisize_(char *i1p, char *i2p) -{ +int cisize_(char *i1p, char *i2p) { int isize_val=0; FILE *f = fopen("conftestval", "w"); if (!f) return 1; isize_val = (int)(i2p - i1p); - fprintf(f,"%d\n", isize_val ); + fprintf(f,"%d\n", isize_val); fclose(f); return 0; } -EOF - pac_tmp_compile='$CC -c $CFLAGS $CPPFLAGS conftestc.c >&5' - if AC_TRY_EVAL(pac_tmp_compile) && test -s conftestc.o ; then - AC_LANG_SAVE - AC_LANG_FORTRAN77 - saveLIBS=$LIBS - LIBS="conftestc.o $LIBS" - dnl TRY_RUN does not work correctly for autoconf 2.13 (the - dnl macro includes C-preprocessor directives that are not - dnl valid in Fortran. Instead, we do this by hand - cat >conftest.f <conftest2.f <conftest.f </dev/null 2>&1 ; then - AC_MSG_RESULT(yes) - AC_MSG_CHECKING([whether routines compiled with $1 can be linked with ones compiled without $1]) - rm -f conftest2.out - rm -f conftest.bas - ac_fscompile3='${F77-f77} -c $save_FFLAGS conftest2.f >conftest2.out 2>&1' - ac_fscompilelink4='${F77-f77} $FFLAGS -o conftest conftest2.o conftest.f $LDFLAGS >conftest.bas 2>&1' - if AC_TRY_EVAL(ac_fscompile3) && test -s conftest2.o ; then - if AC_TRY_EVAL(ac_fscompilelink4) && test -x conftest ; then - if diff -b conftest.out conftest.bas >/dev/null 2>&1 ; then - ac_result="yes" - else - echo "configure: Compiler output differed in two cases" >&AC_FD_CC - diff -b conftest.out conftest.bas >&AC_FD_CC - fi - else - echo "configure: failed program was:" >&AC_FD_CC - cat conftest.f >&AC_FD_CC - fi - else - echo "configure: failed program was:" >&AC_FD_CC - cat conftest2.f >&AC_FD_CC - fi - else - # diff - echo "configure: Compiler output differed in two cases" >&AC_FD_CC - diff -b conftest.out conftest.bas >&AC_FD_CC - fi - else - # try_eval(fscompilelink2) - echo "configure: failed program was:" >&AC_FD_CC - cat conftest.f >&AC_FD_CC - fi - if test "$ac_result" != "yes" -a -s conftest.out ; then - cat conftest.out >&AC_FD_CC - fi +pac_opt="$1" +AC_LANG_PUSH([Fortran 77]) +FFLAGS_orig="$FFLAGS" +FFLAGS_opt="$pac_opt $FFLAGS" +pac_result="unknown" + +AC_LANG_CONFTEST([AC_LANG_PROGRAM()]) +FFLAGS="$FFLAGS_orig" +rm -f pac_test1.log +PAC_LINK_IFELSE_LOG([pac_test1.log], [], [ + FFLAGS="$FFLAGS_opt" + rm -f pac_test2.log + PAC_LINK_IFELSE_LOG([pac_test2.log], [], [ + PAC_RUNLOG_IFELSE([diff -b pac_test1.log pac_test2.log], + [pac_result=yes], [pac_result=no]) + ],[ + pac_result=no + ]) +], [ + pac_result=no +]) +AC_MSG_RESULT([$pac_result]) +dnl Delete the conftest created by AC_LANG_CONFTEST. +rm -f conftest.$ac_ext +# +if test "$pac_result" = "yes" ; then + AC_MSG_CHECKING([whether routines compiled with $pac_opt can be linked with ones compiled without $pac_opt]) + pac_result=unknown + FFLAGS="$FFLAGS_orig" + rm -f pac_test3.log + PAC_COMPILE_IFELSE_LOG([pac_test3.log], [ + AC_LANG_SOURCE([ + subroutine try() + end + ]) + ],[ + PAC_RUNLOG([mv conftest.$OBJEXT pac_conftest.$OBJEXT]) + saved_LIBS="$LIBS" + LIBS="pac_conftest.$OBJEXT $LIBS" + + FFLAGS="$FFLAGS_opt" + rm -f pac_test4.log + PAC_LINK_IFELSE_LOG([pac_test4.log], [AC_LANG_PROGRAM()], [ + PAC_RUNLOG_IFELSE([diff -b pac_test2.log pac_test4.log], + [pac_result=yes], [pac_result=no]) + ],[ + pac_result=no + ]) + LIBS="$saved_LIBS" + rm -f pac_conftest.$OBJEXT + ],[ + pac_result=no + ]) + AC_MSG_RESULT([$pac_result]) + rm -f pac_test3.log pac_test4.log +fi +rm -f pac_test1.log pac_test2.log + +dnl Restore FFLAGS before 2nd/3rd argument commands are executed, +dnl as 2nd/3rd argument command could be modifying FFLAGS. +FFLAGS="$FFLAGS_orig" +if test "$pac_result" = "yes" ; then + ifelse([$2],[],[FOPTIONS="$FOPTIONS $1"],[$2]) else - # Could not compile without the option! - echo "configure: Could not compile program" >&AC_FD_CC - cat conftest.f >&AC_FD_CC - cat conftest.bas >&AC_FD_CC + ifelse([$3],[],[:],[$3]) fi -# Restore FFLAGS before 2nd/3rd argument commands are executed, -# as 2nd/3rd argument command could be modifying FFLAGS. -FFLAGS="$save_FFLAGS" -if test "$ac_result" = "yes" ; then - AC_MSG_RESULT(yes) - ifelse($2,,FOPTIONS="$FOPTIONS $1",$2) -else - AC_MSG_RESULT(no) - $3 -fi -# This is needed for Mac OSX 10.5 -rm -rf conftest.dSYM -rm -f conftest* +AC_LANG_POP([Fortran 77]) ]) - - -dnl/*D -dnl PAC_PROG_F77_CMDARGS - Determine how to access the command line from -dnl Fortran 77 dnl -dnl Output Effects: -dnl The following variables are set: -dnl.vb -dnl F77_GETARG - Statement to get an argument i into string s -dnl F77_IARGC - Routine to return the number of arguments -dnl FXX_MODULE - Module command when using Fortran 90 compiler -dnl F77_GETARGDECL - Declaration of routine used for F77_GETARG -dnl F77_GETARG_FFLAGS - Flags needed when compiling/linking -dnl F77_GETARG_LDFLAGS - Flags needed when linking -dnl.ve -dnl If 'F77_GETARG' has a value, then that value and the values for these -dnl other symbols will be used instead. If no approach is found, all of these -dnl variables will have empty values. -dnl If no other approach works and a file 'f77argdef' is in the directory, -dnl that file will be sourced for the values of the above four variables. -dnl -dnl In most cases, you should add F77_GETARG_FFLAGS to the FFLAGS variable -dnl and F77_GETARG_LDFLAGS to the LDFLAGS variable, to ensure that tests are -dnl performed on the compiler version that will be used. -dnl -dnl 'AC_SUBST' is called for all six variables. -dnl -dnl One complication is that on systems with multiple Fortran compilers, -dnl some libraries used by one Fortran compiler may have been (mis)placed -dnl in a common location. We have had trouble with libg2c in particular. -dnl To work around this, we test whether iargc etc. work first. This -dnl will catch most systems and will speed up the tests. -dnl -dnl Next, the libraries are only added if they are needed to complete a -dnl link; they aren''t added just because they exist. -dnl -dnl f77argdef -dnl D*/ -dnl -dnl Random notes -dnl You can export the command line arguments from C to the g77 compiler -dnl using -dnl extern char **__libc_argv; -dnl extern int __libc_argc; -dnl f_setarg( __libc_argc, __libc_argv ); -dnl -AC_DEFUN([PAC_PROG_F77_CMDARGS],[ -found_cached="yes" -AC_MSG_CHECKING([for routines to access the command line from Fortran 77]) -AC_CACHE_VAL(pac_cv_prog_f77_cmdarg, -[ - AC_MSG_RESULT([searching...]) - found_cached="no" - # First, we perform a quick check. Does iargc and getarg work? - fxx_module="${FXX_MODULE:-}" - f77_getargdecl="${F77_GETARGDECL:-external getarg}" - f77_getarg="${F77_GETARG:-call GETARG(i,s)}" - f77_iargc="${F77_IARGC:-IARGC()}" - # - # Grumble. The Absoft Fortran compiler computes i - i as 0 and then - # 1.0 / 0 at compile time, even though the code may never be executed. - # What we need is a way to generate an error, so the second usage of i - # was replaced with f77_iargc. - cat > conftest.f </dev/null 2>&1 ; then - found_answer="yes" - FXX_MODULE="$fxx_module" - F77_GETARGDECL="$f77_getargdecl" - F77_GETARG="$f77_getarg" - F77_IARGC="$f77_iargc" - AC_MSG_RESULT(yes) - fi - fi - fi - if test $found_answer = "no" ; then - AC_MSG_RESULT(no) - # Grumph. Here are a bunch of different approaches - # We have several axes the check: - # Library to link with (none, -lU77 (HPUX), -lg2c (LINUX f77)) - # PEPCF90 (Intel ifc) - # The first line is a dummy - # (we experimented with using a , but this caused other - # problems because we need in the IFS) - trial_LIBS="0 -lU77 -lPEPCF90" - if test "$NOG2C" != "1" ; then - trial_LIBS="$trial_LIBS -lg2c" - fi - # Discard libs that are not availble: - save_IFS="$IFS" - # Make sure that IFS includes a space, or the tests that run programs - # may fail - IFS=" "" -" - save_trial_LIBS="$trial_LIBS" - trial_LIBS="" - cat > conftest.f <, the space is important - # To make the Absoft f77 and f90 work together, we need to prefer the - # upper case versions of the arguments. They also require libU77. - # -YCFRL=1 causes Absoft f90 to work with g77 and similar (f2c-based) - # Fortran compilers - # - # Problem: The Intel efc compiler hangs when presented with -N109 . - # The only real fix for this is to detect this compiler and exclude - # the test. We may want to reorganize these tests so that if we - # can compile code without special options, we never look for them. - # - using_intel_efc="no" - pac_test_msg=`$F77 -V 2>&1 | grep 'Intel(R) Fortran Itanium'` - if test "$pac_test_msg" != "" ; then - using_intel_efc="yes" - fi - if test "$using_intel_efc" = "yes" ; then - trial_FLAGS="000" - else - trial_FLAGS="000 --N109 --f --YEXT_NAMES=UCS --YEXT_NAMES=LCS --YCFRL=1 -+U77" - fi - # Discard options that are not available: - # (IFS already saved above) - IFS=" "" -" - save_trial_FLAGS="$trial_FLAGS" - trial_FLAGS="" - for flag in $save_trial_FLAGS ; do - if test "$flag" = " " -o "$flag" = "000" ; then - opt_ok="yes" - else - PAC_F77_CHECK_COMPILER_OPTION($flag,opt_ok=yes,opt_ok=no) - fi - if test "$opt_ok" = "yes" ; then - if test "$flag" = " " -o "$flag" = "000" ; then - fflag="" - else - fflag="$flag" - fi - # discard options that don't allow mixed-case name matching - cat > conftest.f < conftest.f </dev/null 2>&1 ; then - found_answer="yes" - fi - else - found_answer="yes" - fi - fi - IFS=" "" -" - if test "$found_answer" = "yes" ; then - AC_MSG_RESULT([yes]) - pac_cv_prog_f77_cmdarg="$MSG" - pac_cv_prog_f77_cmdarg_fflags="$flags" - pac_cv_prog_f77_cmdarg_ldflags="$libs" - break - else - AC_MSG_RESULT([no]) - echo "configure: failed program was:" >&AC_FD_CC - cat conftest.f >&AC_FD_CC - fi - done - done - IFS="$save_IFS" - rm -f conftest.* - trial=`expr $trial + 1` - done -fi -pac_cv_F77_GETARGDECL="$F77_GETARGDECL" -pac_cv_F77_IARGC="$F77_IARGC" -pac_cv_F77_GETARG="$F77_GETARG" -pac_cv_FXX_MODULE="$FXX_MODULE" -]) -if test "$found_cached" = "yes" ; then - AC_MSG_RESULT([$pac_cv_prog_f77_cmdarg]) -elif test -z "$pac_cv_F77_IARGC" ; then - AC_MSG_WARN([Could not find a way to access the command line from Fortran 77]) -fi -# Set the variable values based on pac_cv_prog_xxx -F77_GETARGDECL="$pac_cv_F77_GETARGDECL" -F77_IARGC="$pac_cv_F77_IARGC" -F77_GETARG="$pac_cv_F77_GETARG" -FXX_MODULE="$pac_cv_FXX_MODULE" -F77_GETARG_FFLAGS="$pac_cv_prog_f77_cmdarg_fflags" -F77_GETARG_LDFLAGS="$pac_cv_prog_f77_cmdarg_ldflags" -AC_SUBST(F77_GETARGDECL) -AC_SUBST(F77_IARGC) -AC_SUBST(F77_GETARG) -AC_SUBST(FXX_MODULE) -AC_SUBST(F77_GETARG_FFLAGS) -AC_SUBST(F77_GETARG_LDFLAGS) -]) - - dnl/*D dnl PAC_PROG_F77_LIBRARY_DIR_FLAG - Determine the flag used to indicate dnl the directories to find libraries in @@ -1009,56 +529,51 @@ dnl D*/ dnl dnl An earlier version of this only tried the arguments without using dnl a library. This failed when the HP compiler complained about the -dnl arguments, but produced an executable anyway. +dnl arguments, but produced an executable anyway. AC_DEFUN([PAC_PROG_F77_LIBRARY_DIR_FLAG],[ -if test "X$F77_LIBDIR_LEADER" = "X" ; then AC_CACHE_CHECK([for Fortran 77 flag for library directories], -pac_cv_prog_f77_library_dir_flag, -[ - - rm -f conftest.* conftest1.* - cat > conftest.f < conftest1.f <&AC_FD_CC - cat conftest1.f >&AC_FD_CC - fi - # This is needed for Mac OSX 10.5 - rm -rf conftest.dSYM - rm -f conftest* + ]) +],[ + # pac_f77compile_ok=yes + PAC_RUNLOG([mv conftest.$OBJEXT pac_f77conftest.$OBJEXT]) + PAC_RUNLOG([test -d conftestdir || mkdir conftestdir]) + PAC_RUNLOG([${AR-ar} ${AR_FLAGS-cr} conftestdir/libf77conftest.a pac_f77conftest.$OBJEXT]) + PAC_RUNLOG([${RANLIB-ranlib} conftestdir/libf77conftest.a]) + # Save original LIBS, prepend previously generated object file to LIBS + saved_LIBS="$LIBS" + LIBS="-lf77conftest $LIBS" + saved_LDFLAGS="$LDFLAGS" + pac_cv_prog_f77_library_dir_flag="none" + for ldir in "-L" "-Wl,-L," ; do + LDFLAGS="${ldir}conftestdir $saved_LDFLAGS" + AC_LINK_IFELSE([ + AC_LANG_SOURCE([ + program main + call f1conf + end + ]) + ],[pac_cv_prog_f77_library_dir_flag="$ldir";break]) + done + LDFLAGS="$saved_LDFLAGS" + LIBS="$saved_LIBS" + rm -rf conftestdir + rm -f pac_f77conftest.$OBJEXT +],[]) +AC_LANG_POP([Fortran 77]) ]) +dnl Endof ac_cache_check +if test "X$pac_cv_prog_f77_library_dir_flag" != "Xnone" ; then + F77_LIBDIR_LEADER="$pac_cv_prog_f77_library_dir_flag" AC_SUBST(F77_LIBDIR_LEADER) - if test "X$pac_cv_prog_f77_library_dir_flag" != "X" ; then - F77_LIBDIR_LEADER="$pac_cv_prog_f77_library_dir_flag" - fi fi ]) - +dnl dnl/*D dnl PAC_PROG_F77_HAS_INCDIR - Check whether Fortran accepts -Idir flag dnl @@ -1074,41 +589,43 @@ dnl not to the use of '#include' with the C preprocessor. dnl If directory does not exist, it will be created. In that case, the dnl directory should be a direct descendant of the current directory. dnl -dnl D*/ +dnl D*/ AC_DEFUN([PAC_PROG_F77_HAS_INCDIR],[ -checkdir=$1 +ifelse([$1],[],[checkdir=f77tmpdir],[checkdir=$1;checkdir_is_given=yes]) AC_CACHE_CHECK([for include directory flag for Fortran], pac_cv_prog_f77_has_incdir,[ -if test ! -d $checkdir ; then mkdir $checkdir ; fi -cat >$checkdir/conftestf.h <conftest.f < $checkdir/conftestf.h]) +echo ' call sub()' > $checkdir/conftestf.h +AC_LANG_PUSH([Fortran 77]) +saved_FFLAGS="$FFLAGS" pac_cv_prog_f77_has_incdir="none" # SGI wants -Wf,-I for idir in "-I" "-Wf,-I" ; do - if AC_TRY_EVAL(ac_fcompiletest) && test -s conftest.o ; then - pac_cv_prog_f77_has_incdir="$idir" - break - fi + FFLAGS="${idir} $checkdir $saved_FFLAGS" + AC_COMPILE_IFELSE([ + AC_LANG_SOURCE([ + program main + include 'conftestf.h' + end + ]) + ],[pac_cv_prog_f77_has_incdir="$idir"; break]) done -# This is needed for Mac OSX 10.5 -rm -rf conftest.dSYM -rm -f conftest* -rm -f $checkdir/conftestf.h -]) -AC_SUBST(F77_INCDIR) -if test "X$pac_cv_prog_f77_has_incdir" != "Xnone" ; then - F77_INCDIR="$pac_cv_prog_f77_has_incdir" +FFLAGS="$saved_FFLAGS" +AC_LANG_POP([Fortran 77]) +if test "$checkdir_is_given" = "yes" ; then + rm -f $checkdir/conftestf.h +else + rm -rf $checkdir fi ]) - +dnl Endof ac_cache_check +if test "X$pac_cv_prog_f77_has_incdir" != "Xnone" ; then + F77_INCDIR="$pac_cv_prog_f77_has_incdir" + AC_SUBST(F77_INCDIR) +fi +]) +dnl dnl/*D dnl PAC_PROG_F77_ALLOWS_UNUSED_EXTERNALS - Check whether the Fortran compiler dnl allows unused and undefined functions to be listed in an external @@ -1121,114 +638,72 @@ dnl D*/ AC_DEFUN([PAC_PROG_F77_ALLOWS_UNUSED_EXTERNALS],[ AC_CACHE_CHECK([whether Fortran allows unused externals], pac_cv_prog_f77_allows_unused_externals,[ -AC_LANG_SAVE -AC_LANG_FORTRAN77 -dnl We can't use TRY_LINK, because it wants a routine name, not a -dnl declaration. The following is the body of TRY_LINK, slightly modified. -cat > conftest.$ac_ext <&AC_FD_CC - cat conftest.$ac_ext >&AC_FD_CC - # This is needed for Mac OSX 10.5 - rm -rf conftest.dSYM - rm -rf conftest* - pac_cv_prog_f77_allows_unused_externals="no" - $4 -fi -# This is needed for Mac OSX 10.5 -rm -rf conftest.dSYM -rm -f conftest* -# -AC_LANG_RESTORE +AC_LANG_PUSH([Fortran 77]) +AC_LINK_IFELSE([ + AC_LANG_SOURCE([ + program main + external bar + end + ]) +],[ + pac_cv_prog_f77_allows_unused_externals="yes" +],[ + pac_cv_prog_f77_allows_unused_externals="no" ]) +AC_LANG_POP([Fortran 77]) +]) +dnl Endof ac_cache_check if test "X$pac_cv_prog_f77_allows_unused_externals" = "Xyes" ; then - ifelse([$1],,:,[$1]) + ifelse([$1],[],[:],[$1]) else - ifelse([$2],,:,[$2]) + ifelse([$2],[],[:],[$2]) fi ]) - - -dnl /*D -dnl PAC_PROG_F77_HAS_POINTER - Determine if Fortran allows pointer type -dnl -dnl Synopsis: -dnl PAC_PROG_F77_HAS_POINTER(action-if-true,action-if-false) -dnl D*/ -AC_DEFUN([PAC_PROG_F77_HAS_POINTER],[ -AC_CACHE_CHECK([whether Fortran has pointer declaration], -pac_cv_prog_f77_has_pointer,[ -AC_LANG_SAVE -AC_LANG_FORTRAN77 -AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[ - integer M - pointer (MPTR,M) - data MPTR/0/ -])], - pac_cv_prog_f77_has_pointer="yes", - pac_cv_prog_f77_has_pointer="no") -AC_LANG_RESTORE -]) -if test "$pac_cv_prog_f77_has_pointer" = "yes" ; then - ifelse([$1],,:,[$1]) -else - ifelse([$2],,:,[$2]) -fi -]) - - -dnl pac_prog_f77_run_proc_from_c( c main program, fortran routine, -dnl action-if-works, action-if-fails, -dnl cross-action ) +dnl PAC_PROG_F77_RUN_PROC_FROM_C( c main program, fortran routine, +dnl [action-if-works], [action-if-fails], +dnl [cross-action] ) dnl Fortran routine MUST be named ftest unless you include code dnl to select the appropriate Fortran name. dnl AC_DEFUN([PAC_PROG_F77_RUN_PROC_FROM_C],[ -# This is needed for Mac OSX 10.5 -rm -rf conftest.dSYM -rm -f conftest* -cat < conftest.f -$2 -EOF -dnl -if test "X$ac_fcompile" = "X" ; then - ac_fcompile='${F77-f77} -c $FFLAGS conftest.f 1>&AC_FD_CC' -fi -if AC_TRY_EVAL(ac_fcompile) && test -s conftest.o ; then - mv conftest.o conftestf.o - AC_LANG_SAVE - AC_LANG_C - save_LIBS="$LIBS" - LIBS="conftestf.o $FLIBS $LIBS" - AC_TRY_RUN([#include +AC_REQUIRE([AC_HEADER_STDC]) +AC_REQUIRE([AC_F77_LIBRARY_LDFLAGS]) +AC_LANG_PUSH([Fortran 77]) +AC_COMPILE_IFELSE([ + AC_LANG_SOURCE([$2]) +],[ + # pac_f77compile_ok=yes + PAC_RUNLOG([mv conftest.$OBJEXT pac_f77conftest.$OBJEXT]) + # Save original LIBS, prepend previously generated object file to LIBS + saved_LIBS="$LIBS" + LIBS="pac_f77conftest.$OBJEXT $FLIBS $LIBS" + AC_LANG_PUSH([C]) + AC_RUN_IFELSE([ + AC_LANG_SOURCE([ +#if defined(HAVE_STDIO_H) || defined(STDC_HEADERS) +#include +#endif #ifdef F77_NAME_UPPER #define ftest_ FTEST #elif defined(F77_NAME_LOWER) || defined(F77_NAME_MIXED) #define ftest_ ftest #endif $1 -], [$3], [$4], [$5] ) - LIBS="$save_LIBS" - AC_LANG_RESTORE -else - echo "configure: failed program was:" >&AC_FD_CC - cat conftest.f >&AC_FD_CC -fi -# This is needed for Mac OSX 10.5 -rm -rf conftest.dSYM -rm -f conftest* + ]) + ],[ + ifelse([$3],[],[:],[$3]) + ],[ + ifelse([$4],[],[:],[$4]) + ],[ + ifelse([$5],[],[:],[$5]) + ]) + AC_LANG_POP([C]) + LIBS="$saved_LIBS" + rm -f pac_f77conftest.$OBJEXT +],[ +]) +AC_LANG_POP([Fortran 77]) ]) - - dnl PAC_PROG_F77_IN_C_LIBS dnl dnl Find the essential libraries that are needed to use the C linker to @@ -1245,27 +720,31 @@ dnl by trying to *run* a trivial program. It only checks for *linking*. dnl dnl AC_DEFUN([PAC_PROG_F77_IN_C_LIBS],[ +AC_REQUIRE([AC_HEADER_STDC]) +AC_REQUIRE([AC_F77_LIBRARY_LDFLAGS]) AC_MSG_CHECKING([for which Fortran libraries are needed to link C with Fortran]) -F77_IN_C_LIBS="$FLIBS" -# This is needed for Mac OSX 10.5 -rm -rf conftest.dSYM -rm -f conftest* -cat < conftest.f +F77_IN_C_LIBS="invalid" +AC_LANG_PUSH([Fortran 77]) +AC_COMPILE_IFELSE([ + AC_LANG_SOURCE([ subroutine ftest end -EOF -dnl -if test "X$ac_fcompile" = "X" ; then - ac_fcompile='${F77-f77} -c $FFLAGS conftest.f 1>&AC_FD_CC' -fi -if AC_TRY_EVAL(ac_fcompile) && test -s conftest.o ; then - mv conftest.o mconftestf.o - AC_LANG_SAVE - AC_LANG_C - save_LIBS="$LIBS" - dnl First try with no libraries - LIBS="mconftestf.o $save_LIBS" - AC_TRY_LINK([#include ],[ + ]) +],[ + # pac_f77compile_ok=yes + PAC_RUNLOG([mv conftest.$OBJEXT pac_f77conftest.$OBJEXT]) + # Save original LIBS, prepend previously generated object file to LIBS + saved_LIBS="$LIBS" + LIBS="pac_f77conftest.$OBJEXT $FLIBS $saved_LIBS" + AC_LANG_PUSH([C]) + + # Create conftest for all link tests. + AC_LANG_CONFTEST([ + AC_LANG_PROGRAM([ +#if defined(HAVE_STDIO_H) || defined(STDC_HEADERS) +#include +#endif + ],[ #ifdef F77_NAME_UPPER #define ftest_ FTEST #elif defined(F77_NAME_LOWER) || defined(F77_NAME_MIXED) @@ -1273,281 +752,295 @@ if AC_TRY_EVAL(ac_fcompile) && test -s conftest.o ; then #endif extern void ftest_(void); ftest_(); -], [link_worked=yes], [link_worked=no] ) - if test "$link_worked" = "no" ; then + ]) + ]) + + F77_IN_C_LIBS="" + AC_LINK_IFELSE([],[:],[ flibdirs=`echo $FLIBS | tr ' ' '\012' | grep '\-L' | tr '\012' ' '` fliblibs=`echo $FLIBS | tr ' ' '\012' | grep -v '\-L' | tr '\012' ' '` for flibs in $fliblibs ; do - LIBS="mconftestf.o $flibdirs $flibs $save_LIBS" - AC_TRY_LINK([#include ],[ -#ifdef F77_NAME_UPPER -#define ftest_ FTEST -#elif defined(F77_NAME_LOWER) || defined(F77_NAME_MIXED) -#define ftest_ ftest -#endif -extern void ftest_(void); -ftest_(); -], [link_worked=yes], [link_worked=no] ) - if test "$link_worked" = "yes" ; then - F77_IN_C_LIBS="$flibdirs $flibs" - break - fi + LIBS="pac_f77conftest.$OBJEXT $flibdirs $flibs $saved_LIBS" + AC_LINK_IFELSE([],[F77_IN_C_LIBS="$flibdirs $flibs"; break]) done - if test "$link_worked" = "no" ; then - # try to add libraries until it works... - flibscat="" - for flibs in $fliblibs ; do - flibscat="$flibscat $flibs" - LIBS="mconftestf.o $flibdirs $flibscat $save_LIBS" - AC_TRY_LINK([#include ],[ -#ifdef F77_NAME_UPPER -#define ftest_ FTEST -#elif defined(F77_NAME_LOWER) || defined(F77_NAME_MIXED) -#define ftest_ ftest -#endif -extern void ftest_(void); -ftest_(); -], [link_worked=yes], [link_worked=no] ) - if test "$link_worked" = "yes" ; then - F77_IN_C_LIBS="$flibdirs $flibscat" - break - fi - done - fi - else - # No libraries needed - F77_IN_C_LIBS="" - fi - LIBS="$save_LIBS" - AC_LANG_RESTORE -else - echo "configure: failed program was:" >&AC_FD_CC - cat conftest.f >&AC_FD_CC -fi -# This is needed for Mac OSX 10.5 -rm -rf conftest.dSYM -rm -f conftest* mconftest* -if test -z "$F77_IN_C_LIBS" ; then + if test "X$F77_IN_C_LIBS" = "X" ; then + flibscat="" + for flibs in $fliblibs ; do + flibscat="$flibscat $flibs" + LIBS="pac_f77conftest.$OBJEXT $flibdirs $flibscat $saved_LIBS" + AC_LINK_IFELSE([],[F77_IN_C_LIBS="$flibdirs $flibscat";break]) + done + fi + ]) + + # remove conftest created by ac_lang_conftest + rm -f conftest.$ac_ext + AC_LANG_POP([C]) + LIBS="$saved_LIBS" + rm -f pac_f77conftest.$OBJEXT +]) +AC_LANG_POP([Fortran 77]) +if test "X$F77_IN_C_LIBS" = "X" ; then AC_MSG_RESULT(none) else AC_MSG_RESULT($F77_IN_C_LIBS) fi ]) - +dnl dnl Test to see if we should use C or Fortran to link programs whose dnl main program is in Fortran. We may find that neither work because dnl we need special libraries in each case. dnl AC_DEFUN([PAC_PROG_F77_LINKER_WITH_C],[ -AC_LANG_SAVE -AC_LANG_C -AC_TRY_COMPILE(, -long long a;,AC_DEFINE(HAVE_LONG_LONG,1,[Define if long long allowed])) -AC_MSG_CHECKING([for linker for Fortran main programs]) -dnl -dnl Create a program that uses multiplication and division in case -dnl that requires special libraries -cat > conftest.c < conftest.f <&AC_FD_CC ; then - AC_MSG_RESULT([Use Fortran to link programs]) - elif ${CC} ${CFLAGS} -o conftest conftest.o conftest1.o $LDFLAGS $FLIBS 2>&AC_FD_CC ; then - AC_MSG_RESULT([Use C with FLIBS to link programs]) - F77LINKER="$CC" - F77_LDFLAGS="$F77_LDFLAGS $FLIBS" - else - AC_MSG_RESULT([Unable to determine how to link Fortran programs with C]) - fi -else - AC_MSG_ERROR([Could not compile Fortran test program]) -fi -AC_LANG_RESTORE + ]) ]) +AC_LANG_POP([Fortran 77]) +dnl Initialize flags +pac_linkwithf77=no +pac_linkwithC=no + +dnl Use F77 as a linker to compile a Fortran main and C subprogram. +if test "$pac_linkwithC" != "yes" ; then + AC_LANG_PUSH([C]) + AC_COMPILE_IFELSE([],[ + PAC_RUNLOG([mv conftest.$OBJEXT pac_conftest.$OBJEXT]) + saved_LIBS="$LIBS" + LIBS="pac_conftest.$OBJEXT $saved_LIBS" + AC_LANG_PUSH([Fortran 77]) + AC_LINK_IFELSE([],[ + AC_MSG_RESULT([Use Fortran to link programs]) + pac_linkwithf77=yes + ]) + AC_LANG_POP([Fortran 77]) + LIBS="$saved_LIBS" + rm -f pac_conftest.$OBJEXT + ]) + AC_LANG_POP([C]) +fi + +dnl Use C as a linker and FLIBS to compile a Fortran main and C subprogram. +if test "$pac_linkwithf77" != "yes" ; then + AC_LANG_PUSH([Fortran 77]) + AC_COMPILE_IFELSE([],[ + PAC_RUNLOG([mv conftest.$OBJEXT pac_f77conftest.$OBJEXT]) + saved_LIBS="$LIBS" + LIBS="pac_f77conftest.$OBJEXT $FLIBS $saved_LIBS" + AC_LANG_PUSH([C]) + AC_LINK_IFELSE([],[ + pac_linkwithC=yes + AC_MSG_RESULT([Use C with FLIBS to link programs]) + F77LINKER="$CC" + F77_LDFLAGS="$F77_LDFLAGS $FLIBS" + ]) + AC_LANG_POP([C]) + LIBS="$saved_LIBS" + rm -f pac_f77conftest.$OBJEXT + ]) + AC_LANG_POP([Fortran 77]) +fi + +AC_LANG_PUSH([Fortran 77]) +rm -f conftest.$ac_ext +AC_LANG_POP([Fortran 77]) + +AC_LANG_PUSH([C]) +rm -f conftest.$ac_ext +AC_LANG_POP([C]) + +if test "$pac_linkwithf77" != "yes" -a "$pac_linkwithC" != "yes" ; then + AC_MSG_ERROR([Could not determine a way to link a Fortran test program!]) +fi +]) +dnl dnl Check to see if a C program can be linked when using the libraries dnl needed by C programs dnl -AC_DEFUN([PAC_PROG_F77_CHECK_FLIBS], -[AC_MSG_CHECKING([whether C can link with $FLIBS]) +AC_DEFUN([PAC_PROG_F77_CHECK_FLIBS],[ +AC_REQUIRE([AC_F77_LIBRARY_LDFLAGS]) +AC_MSG_CHECKING([whether $CC links with FLIBS found by autoconf]) +AC_LANG_PUSH([C]) +# Create a simple C program for the tests. +AC_LANG_CONFTEST([ + AC_LANG_PROGRAM([],[int a;]) +]) # Try to link a C program with all of these libraries -save_LIBS="$LIBS" -LIBS="$LIBS $FLIBS" -AC_TRY_LINK(,[int a;],runs=yes,runs=no) -LIBS="$save_LIBS" -AC_MSG_RESULT($runs) -if test "$runs" = "no" ; then +saved_LIBS="$LIBS" +LIBS="$FLIBS $saved_LIBS" +AC_LINK_IFELSE([],[ + AC_MSG_RESULT([yes]) +],[ + AC_MSG_RESULT([no]) AC_MSG_CHECKING([for which libraries can be used]) pac_ldirs="" pac_libs="" pac_other="" for name in $FLIBS ; do case $name in - -l*) pac_libs="$pac_libs $name" ;; + -l*) pac_libs="$pac_libs $name" ;; -L*) pac_ldirs="$pac_ldirs $name" ;; - *) pac_other="$pac_other $name" ;; + *) pac_other="$pac_other $name" ;; esac done - save_LIBS="$LIBS" keep_libs="" - for name in $pac_libs ; do - LIBS="$save_LIBS $pac_ldirs $pac_other $name" - AC_TRY_LINK(,[int a;],runs=yes,runs=no) - if test $runs = "yes" ; then keep_libs="$keep_libs $name" ; fi + for name in $pac_libs ; do + LIBS="$saved_LIBS $pac_ldirs $pac_other $name" + AC_LINK_IFELSE([],[ + keep_libs="$keep_libs $name" + ]) done AC_MSG_RESULT($keep_libs) - LIBS="$save_LIBS" FLIBS="$pac_ldirs $pac_other $keep_libs" -fi ]) - +LIBS="$saved_LIBS" +rm -f conftest.$ac_ext +AC_LANG_PUSH([C]) +]) +dnl dnl Test for extra libraries needed when linking C routines that use dnl stdio with Fortran. This test was created for OSX, which dnl sometimes requires -lSystemStubs. If another library is needed, dnl add it to F77_OTHER_LIBS +dnl AC_DEFUN([PAC_PROG_F77_AND_C_STDIO_LIBS],[ - # To simply the code in the cache_check macro, chose the routine name - # first, in case we need it - confname=conf1_ - case "$pac_cv_prog_f77_name_mangle" in +AC_REQUIRE([AC_HEADER_STDC]) +AC_REQUIRE([PAC_PROG_F77_NAME_MANGLE]) +# To simply the code in the cache_check macro, chose the routine name +# first, in case we need it +confname=conf1_ +case "$pac_cv_prog_f77_name_mangle" in "lower underscore") confname=conf1_ ;; "upper stdcall") confname=CONF1 ;; - upper) confname=CONF1 ;; + "upper") confname=CONF1 ;; "lower doubleunderscore") confname=conf1_ ;; - lower) confname=conf1 ;; + "lower") confname=conf1 ;; "mixed underscore") confname=conf1_ ;; - mixed) confname=conf1 ;; - esac + "mixed") confname=conf1 ;; +esac - AC_CACHE_CHECK([what libraries are needed to link Fortran programs with C routines that use stdio],pac_cv_prog_f77_and_c_stdio_libs,[ - pac_cv_prog_f77_and_c_stdio_libs=unknown - # This is needed for Mac OSX 10.5 - rm -rf conftest.dSYM - rm -f conftest* - cat >conftest.f <conftestc.c < -int $confname( int a ) -{ printf( "The answer is %d\n", a ); fflush(stdout); return 0; } -EOF - tmpcmd='${CC-cc} -c $CFLAGS conftestc.c 1>&AC_FD_CC' - if AC_TRY_EVAL(tmpcmd) && test -s conftestc.o ; then - : - else - echo "configure: failed program was:" >&AC_FD_CC - cat conftestc.c >&AC_FD_CC +#endif +int $confname(int a) { + printf( "The answer is %d\n", a ); fflush(stdout); return 0; +} + ]) +],[ + PAC_RUNLOG([mv conftest.$OBJEXT pac_conftest.$OBJEXT]) + saved_LIBS="$LIBS" + AC_LANG_PUSH([Fortran 77]) + AC_LANG_CONFTEST([ + AC_LANG_SOURCE([ + program main + call conf1(0) + end + ]) + ]) + for extralib in "" "-lSystemStubs" ; do + LIBS="pac_conftest.$OBJEXT $saved_LIBS $extralib" + AC_LINK_IFELSE([],[ + pac_cv_prog_f77_and_c_stdio_libs="$extralib"; break + ]) + done + if test "X$pac_cv_prog_f77_and_c_stdio_libs" = "X" ; then + pac_cv_prog_f77_and_c_stdio_libs=none fi - - tmpcmd='${F77-f77} $FFLAGS -o conftest conftest.f conftestc.o 1>&AC_FD_CC' - if AC_TRY_EVAL(tmpcmd) && test -x conftest ; then - pac_cv_prog_f77_and_c_stdio_libs=none - else - # Try again with -lSystemStubs - tmpcmd='${F77-f77} $FFLAGS -o conftest conftest.f conftestc.o -lSystemStubs 1>&AC_FD_CC' - if AC_TRY_EVAL(tmpcmd) && test -x conftest ; then - pac_cv_prog_f77_and_c_stdio_libs="-lSystemStubs" - else - echo "configure: failed program was:" >&AC_FD_CC - cat conftestc.c >&AC_FD_CC - echo "configure: with Fortran 77 program:" >&AC_FD_CC - cat conftest.f >&AC_FD_CC - fi - fi - - # This is needed for Mac OSX 10.5 - rm -rf conftest.dSYM - rm -f conftest* + rm -f conftest.$ac_ext + AC_LANG_POP([Fortran 77]) + LIBS="$saved_LIBS" + rm -f pac_conftest.$OBJEXT ]) -if test "$pac_cv_prog_f77_and_c_stdio_libs" != none -a \ - "$pac_cv_prog_f77_and_c_stdio_libs" != unknown ; then - F77_OTHER_LIBS="$F77_OTHER_LIBS $pac_cv_prog_f77_and_c_stdio_libs" +AC_LANG_POP([C]) +]) +dnl Endof ac_cache_check +if test "$pac_cv_prog_f77_and_c_stdio_libs" != "none" \ + -a "$pac_cv_prog_f77_and_c_stdio_libs" != "unknown" ; then + F77_OTHER_LIBS="$F77_OTHER_LIBS $pac_cv_prog_f77_and_c_stdio_libs" fi ]) - +dnl dnl Check that the FLIBS determined by AC_F77_LIBRARY_LDFLAGS is valid. dnl That macro (at least as of autoconf 2.59) attempted to parse the output dnl of the compiler when asked to be verbose; in the case of the Fujitsu dnl frt Fortran compiler, it included files that frt looked for and then dnl discarded because they did not exist. +dnl AC_DEFUN([PAC_PROG_F77_FLIBS_VALID],[ - pac_cv_f77_flibs_valid=unknown - AC_MSG_CHECKING([whether $F77 accepts the FLIBS found by autoconf]) - AC_LANG_SAVE - AC_LANG_FORTRAN77 -dnl We can't use TRY_LINK, because it wants a routine name, not a -dnl declaration. The following is the body of TRY_LINK, slightly modified. -cat > conftest.$ac_ext <&AC_FD_CC - cat conftest.$ac_ext >&AC_FD_CC - pac_cv_f77_flibs_valid=no - fi -AC_MSG_RESULT($pac_cv_f77_flibs_valid) -if test $pac_cv_f77_flibs_valid = no ; then - # See which ones *are* valid +AC_REQUIRE([AC_F77_LIBRARY_LDFLAGS]) +AC_MSG_CHECKING([whether $F77 accepts the FLIBS found by autoconf]) +pac_cv_f77_flibs_valid=unknown +AC_LANG_PUSH([Fortran 77]) +AC_LANG_CONFTEST([ + AC_LANG_SOURCE([ + program main + end + ]) +]) +AC_LINK_IFELSE([],[ + AC_MSG_RESULT([yes]) +],[ + AC_MSG_RESULT([no]) AC_MSG_CHECKING([for valid entries in FLIBS]) goodFLIBS="" saveFLIBS=$FLIBS FLIBS="" for arg in $saveFLIBS ; do - FLIBS="$goodFLIBS $arg" - if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then - goodFLIBS=$FLIBS - else - echo "configure: failed program was:" >&AC_FD_CC - cat conftest.$ac_ext >&AC_FD_CC - fi - done + FLIBS="$goodFLIBS $arg" + AC_LINK_IFELSE([],[goodFLIBS=$FLIBS]) + done FLIBS=$goodFLIBS AC_MSG_RESULT($FLIBS) -fi -# -# This is needed for Mac OSX 10.5 -rm -rf conftest.dSYM -rm -f conftest* -AC_LANG_RESTORE ]) - - -AC_DEFUN([PAC_PROG_F77_OBJ_LINKS_WITH_C],[ -AC_MSG_CHECKING([whether Fortran 77 and C objects are compatible]) +rm -f conftest.$ac_ext +AC_LANG_POP([Fortran 77]) +]) dnl -rm -rf conftestc.dSYM -rm -f conftestc* -dnl construct with a C function with all possible F77 name mangling schemes. -cat <<_EOF > conftestc.c +dnl Check if the Fortran 77 and C objects are compatible in linking. +dnl e.g. On some intel x86_64 Mac, Fortran compiler's default binary format +dnl is different from C, so either -m64 or -m32 is needed in either CFLAGS +dnl or FFLAGS. +dnl +AC_DEFUN([PAC_PROG_F77_OBJ_LINKS_WITH_C],[ +AC_REQUIRE([AC_F77_LIBRARY_LDFLAGS]) +AC_MSG_CHECKING([whether Fortran 77 and C objects are compatible]) +AC_LANG_PUSH([C]) +AC_LANG_CONFTEST([ + AC_LANG_SOURCE([ /* lower */ void c_subpgm( int *rc ); void c_subpgm( int *rc ) { *rc = 1; } @@ -1571,70 +1064,424 @@ void C_subpgm( int *rc ) { *rc = 5; } /* mixed underscore */ void C_subpgm_( int *rc ); void C_subpgm_( int *rc ) { *rc = 6; } -_EOF -dnl -dnl Compile the C function into object file. -dnl -pac_Ccompile='${CC-cc} -c $CFLAGS conftestc.c 1>&AC_FD_CC' -if AC_TRY_EVAL(pac_Ccompile) && test -s conftestc.${ac_objext} ; then - pac_c_working=yes -else - pac_c_working=no - echo "configure: failed C program was:" >&AC_FD_CC - cat conftestc.c >&AC_FD_CC + ]) +]) +AC_LANG_POP([C]) + +AC_LANG_PUSH([Fortran 77]) +AC_LANG_CONFTEST([ + AC_LANG_SOURCE([ + program test + integer rc + rc = -1 + call c_subpgm( rc ) + write(6,*) "rc=", rc + end + ]) +]) +AC_LANG_POP([Fortran 77]) + +dnl Initialize flags +pac_linkwithf77=no +pac_linkwithC=no + +dnl Use F77 as a linker to compile a Fortran main and C subprogram. +if test "$pac_linkwithC" != "yes" ; then + AC_LANG_PUSH([C]) + AC_COMPILE_IFELSE([],[ + PAC_RUNLOG([mv conftest.$OBJEXT pac_conftest.$OBJEXT]) + saved_LIBS="$LIBS" + LIBS="pac_conftest.$OBJEXT $saved_LIBS" + AC_LANG_PUSH([Fortran 77]) + AC_LINK_IFELSE([],[ + pac_linkwithf77=yes + AC_MSG_RESULT([yes]) + ]) + AC_LANG_POP([Fortran 77]) + LIBS="$saved_LIBS" + if test "$pac_linkwithf77" = "yes" ; then + rm -f pac_conftest.$OBJEXT + fi + ]) + AC_LANG_POP([C]) fi -dnl -rm -rf conftestf.dSYM -rm -f conftestf* -cat <<_EOF > conftestf.f - program test - integer rc - rc = -1 - call c_subpgm( rc ) - write(6,*) "rc=", rc - end -_EOF -dnl - compile the fortran program into object file -pac_Fcompile='${F77-f77} -c $FFLAGS conftestf.f 1>&AC_FD_CC' -if AC_TRY_EVAL(pac_Fcompile) && test -s conftestf.${ac_objext} ; then - pac_f77_working=yes -else - pac_f77_working=no - echo "configure: failed F77 program was:" >&AC_FD_CC - cat conftestf.f >&AC_FD_CC + +dnl Use C as a linker and FLIBS to compile a Fortran main and C subprogram. +if test "$pac_linkwithf77" != "yes" ; then + AC_LANG_PUSH([Fortran 77]) + AC_COMPILE_IFELSE([],[ + PAC_RUNLOG([mv conftest.$OBJEXT pac_f77conftest.$OBJEXT]) + saved_LIBS="$LIBS" + LIBS="pac_f77conftest.$OBJEXT $FLIBS $saved_LIBS" + AC_LANG_PUSH([C]) + AC_LINK_IFELSE([],[ + pac_linkwithC=yes + AC_MSG_RESULT([yes]) + ]) + AC_LANG_POP([C]) + LIBS="$saved_LIBS" + if test "$pac_linkwithC" = "yes" ; then + rm -f pac_f77conftest.$OBJEXT + fi + ]) + AC_LANG_POP([Fortran 77]) fi -dnl -if test "$pac_c_working" = "yes" -a "$pac_f77_working" = "yes" ; then -dnl Try linking with F77 compiler - rm -f conftest${ac_exeext} - pac_link='$F77 $FFLAGS -o conftest${ac_exeext} conftestf.${ac_objext} conftestc.${ac_objext} $LDFLAGS >&AC_FD_CC' - if AC_TRY_EVAL(pac_link) && test -s conftest${ac_exeext} ; then - AC_MSG_RESULT(yes) - rm -fr conftestf.dSYM conftestc.dSYM conftest.dSYM - rm -f conftest* - else -dnl Try linking with C compiler - rm -f conftest${ac_exeext} - pac_link='$CC $CFLAGS -o conftest${ac_exeext} conftestf.${ac_objext} conftestc.${ac_objext} $LDFLAGS $FLIBS >&AC_FD_CC' - if AC_TRY_EVAL(pac_link) && test -s conftest${ac_exeext} ; then - AC_MSG_RESULT(yes) - rm -fr conftestf.dSYM conftestc.dSYM conftest.dSYM - rm -f conftest* - else - AC_MSG_RESULT(no) - AC_CHECK_PROG(FILE, file, file, []) - if test "X$FILE" != "X" ; then - fobjtype="`${FILE} conftestf.${ac_objext} | sed -e \"s|conftestf\.${ac_objext}||g\"`" - cobjtype="`${FILE} conftestc.${ac_objext} | sed -e \"s|conftestc\.${ac_objext}||g\"`" - if test "$fobjtype" != "$cobjtype" ; then - AC_MSG_ERROR([**** Incompatible Fortran and C Object File Types! **** + +AC_LANG_PUSH([Fortran 77]) +rm -f conftest.$ac_ext +AC_LANG_POP([Fortran 77]) + +AC_LANG_PUSH([C]) +rm -f conftest.$ac_ext +AC_LANG_POP([C]) + +if test "$pac_linkwithf77" != "yes" -a "$pac_linkwithC" != "yes" ; then + AC_MSG_RESULT(no) + AC_CHECK_PROG(FILE, file, file, []) + if test "X$FILE" != "X" ; then + fobjtype="`${FILE} pac_f77conftest.$OBJEXT | sed -e \"s|pac_f77conftest\.$OBJEXT||g\"`" + cobjtype="`${FILE} pac_conftest.$OBJEXT | sed -e \"s|pac_conftest\.$OBJEXT||g\"`" + if test "$fobjtype" != "$cobjtype" ; then + AC_MSG_ERROR([**** Incompatible Fortran and C Object File Types! **** F77 Object File Type produced by \"${F77} ${FFLAGS}\" is : ${fobjtype}. C Object File Type produced by \"${CC} ${CFLAGS}\" is : ${cobjtype}.]) - fi - fi fi fi -else - AC_MSG_RESULT([failed compilation]) fi ]) +dnl +dnl /*D +dnl PAC_F77_WORKS_WITH_CPP +dnl +dnl Checks if Fortran 77 compiler works with C preprocessor +dnl +dnl Most systems allow the Fortran compiler to process .F and .F90 files +dnl using the C preprocessor. However, some systems either do not +dnl allow this or have serious bugs (OSF Fortran compilers have a bug +dnl that generates an error message from cpp). The following test +dnl checks to see if .F works, and if not, whether "cpp -P -C" can be used +dnl D*/ +AC_DEFUN([PAC_F77_WORKS_WITH_CPP],[ +AC_REQUIRE([AC_PROG_CPP]) +AC_MSG_CHECKING([whether Fortran 77 compiler processes .F files with C preprocessor]) +AC_LANG_PUSH([Fortran 77]) +saved_f77_ext=${ac_ext} +ac_ext="F" +saved_FFLAGS="$FFLAGS" +FFLAGS="$FFLAGS $CPPFLAGS" +AC_LANG_CONFTEST([ + AC_LANG_SOURCE([ + program main +#define ASIZE 10 + integer a(ASIZE) + end + ]) +]) +AC_COMPILE_IFELSE([],[ + pac_cv_f77_accepts_F=yes + ifelse([$1],[],[],[$1=""]) +],[ + pac_cv_f77_accepts_F=no + ifelse([$1],[],[:],[$1="false"]) +]) +# Restore Fortran 77's ac_ext but not FFLAGS +ac_ext="$saved_f77_ext" + +if test "$pac_cv_f77_accepts_F" != "yes" ; then + pac_cpp_f77="$ac_cpp -C -P conftest.F > conftest.$ac_ext" + PAC_RUNLOG_IFELSE([$pac_cpp_f77],[ + if test -s conftest.${ac_ext} ; then + AC_COMPILE_IFELSE([],[ + pac_cv_f77_accepts_F="no, use cpp" + ifelse([$1],[],[],[$1="$CPP -C -P"]) + ],[]) + rm -f conftest.${ac_ext} + fi + ],[]) +fi +FFLAGS="$saved_FFLAGS" +rm -f conftest.F +AC_LANG_POP([Fortran 77]) +AC_MSG_RESULT([$pac_cv_f77_accepts_F]) +]) +dnl +dnl /*D +dnl PAC_PROG_F77_CRAY_POINTER - Check if Fortran 77 supports Cray-style pointer. +dnl If so, set pac_cv_prog_f77_has_pointer to yes +dnl and find out if any extra compiler flag is +dnl needed and set it as CRAYPTR_FFLAGS. +dnl i.e. CRAYPTR_FFLAGS is meaningful only if +dnl pac_cv_prog_f77_has_pointer = yes. +dnl +dnl Synopsis: +dnl PAC_PROG_F77_CRAY_POINTER([action-if-true],[action-if-false]) +dnl D*/ +AC_DEFUN([PAC_PROG_F77_CRAY_POINTER],[ +AC_CACHE_CHECK([whether Fortran 77 supports Cray-style pointer], +pac_cv_prog_f77_has_pointer,[ +AC_LANG_PUSH([Fortran 77]) +AC_LANG_CONFTEST([ + AC_LANG_PROGRAM([],[ + integer M + pointer (MPTR,M) + data MPTR/0/ + ]) +]) +saved_FFLAGS="$FFLAGS" +pac_cv_prog_f77_has_pointer=no +CRAYPTR_FFLAGS="" +for ptrflag in '' '-fcray-pointer' ; do + FFLAGS="$saved_FFLAGS $ptrflag" + AC_COMPILE_IFELSE([], [ + pac_cv_prog_f77_has_pointer=yes + CRAYPTR_FFLAGS="$ptrflag" + break + ]) +done +dnl Restore FFLAGS first, since user may not want to modify FFLAGS +FFLAGS="$saved_FFLAGS" +dnl remove conftest after ac_lang_conftest +rm -f conftest.$ac_ext +AC_LANG_POP([Fortran 77]) +]) +if test "$pac_cv_prog_f77_has_pointer" = "yes" ; then + AC_MSG_CHECKING([for Fortran 77 compiler flag for Cray-style pointer]) + if test "X$CRAYPTR_FFLAGS" != "X" ; then + AC_MSG_RESULT([$CRAYPTR_FFLAGS]) + else + AC_MSG_RESULT([none]) + fi + ifelse([$1],[],[:],[$1]) +else + ifelse([$2],[],[:],[$2]) +fi +]) +dnl +dnl +dnl PAC_F77_INIT_WORKS_WITH_C +dnl +AC_DEFUN([PAC_F77_INIT_WORKS_WITH_C],[ +AC_REQUIRE([AC_HEADER_STDC]) +AC_MSG_CHECKING([whether Fortran init will work with C]) +pac_f_init_works_with_c=unknown +AC_LANG_PUSH([Fortran 77]) +AC_COMPILE_IFELSE([ + AC_LANG_SOURCE([ + subroutine minit() + common /m1/ vc, vc2 + character*1 vc(1,1), vc2(1) + common /m2/ vd + integer vd + save /m1/, /m2/ + call minitc( vc, vc2, vd ) + end + ]) +],[ + PAC_RUNLOG([mv conftest.$OBJEXT pac_f77conftest.$OBJEXT]) + saved_LIBS="$LIBS" + # This test checks if Fortran init can be done in pure C environment, + # i.e. no FLIBS in linking, so don't put FLIBS in LIBS below + dnl LIBS="pac_f77conftest.$OBJEXT $FLIBS $LIBS" + LIBS="pac_f77conftest.$OBJEXT $LIBS" + AC_LANG_PUSH([C]) + AC_LINK_IFELSE([ + AC_LANG_SOURCE([ +#if defined(HAVE_STDIO_H) || defined(STDC_HEADERS) +#include +#endif +#ifdef F77_NAME_UPPER +#define minit_ MINIT +#elif defined(F77_NAME_LOWER) || defined(F77_NAME_MIXED) +#define minit_ minit +#endif +extern void minit_(void); +int main( int argc, char **argv ) +{ + minit_(); + return 0; +} +char *v1 = 0; +char *vc2 = 0; +int v2 = 0; +void minitc_( char *dv1, int d, char *dv2, int d2, int dv3 ); +void minitc_( char *dv1, int d, char *dv2, int d2, int dv3 ) +{ +v1 = dv1; +v2 = dv3; +vc2 = dv2; +*vc2 = ' '; +} + ]) + ],[pac_f_init_works_with_c=yes],[pac_f_init_works_with_c=no]) + AC_LANG_POP([C]) + LIBS="$saved_LIBS" + rm -f pac_f77conftest.$OBJEXT +]) +AC_LANG_POP([Fortran 77]) +AC_MSG_RESULT([$pac_f_init_works_with_c]) +]) +dnl +dnl PAC_F77_LOGICALS_IN_C(MPI_FINT) +dnl +dnl where MPI_FINT is the C type for Fortran integer. +dnl +dnl Use a Fortran main program. This simplifies some steps, +dnl since getting all of the Fortran libraries (including shared +dnl libraries that are not in the default library search path) can +dnl be tricky. Specifically, The PROG_F77_RUN_PROC_FROM_C failed with +dnl some installations of the Portland group compiler. +dnl +dnl We'd also like to check other values for .TRUE. and .FALSE. to see +dnl if the compiler allows (or uses) more than one value (some DEC compilers, +dnl for example, used the high (sign) bit to indicate true and false; the +dnl rest of the bits were ignored. For now, we'll assume that there are +dnl unique true and false values. +dnl +AC_DEFUN([PAC_F77_LOGICALS_IN_C],[ +AC_REQUIRE([AC_HEADER_STDC]) +AC_REQUIRE([PAC_PROG_F77_NAME_MANGLE]) +pac_mpi_fint="$1" +AC_MSG_CHECKING([for values of Fortran logicals]) +AC_CACHE_VAL(pac_cv_prog_f77_true_false_value,[ +pac_cv_prog_f77_true_false_value="" +AC_LANG_PUSH([C]) +AC_COMPILE_IFELSE([ + AC_LANG_SOURCE([ +#if defined(HAVE_STDIO_H) || defined(STDC_HEADERS) +#include +#endif +#if defined(HAVE_STDLIB_H) || defined(STDC_HEADERS) +#include +#endif +#ifdef F77_NAME_UPPER +#define ftest_ FTEST +#elif defined(F77_NAME_LOWER) || defined(F77_NAME_MIXED) +#define ftest_ ftest +#endif +void ftest_( $pac_mpi_fint *, $pac_mpi_fint *); +void ftest_( $pac_mpi_fint *itrue, $pac_mpi_fint *ifalse ) +{ + FILE *f = fopen("conftestval","w"); + if (!f) exit(1); + fprintf( f, "%d %d\n", *itrue, *ifalse ); + fclose(f); +} + ]) +],[ + PAC_RUNLOG([mv conftest.$OBJEXT pac_conftest.$OBJEXT]) + saved_LIBS="$LIBS" + LIBS="pac_conftest.$OBJEXT $saved_LIBS" + AC_LANG_PUSH([Fortran 77]) + AC_RUN_IFELSE([ + AC_LANG_SOURCE([ + program main + logical itrue, ifalse + itrue = .TRUE. + ifalse = .FALSE. + call ftest( itrue, ifalse ) + end + ]) + ],[ + pac_cv_prog_f77_true_false_value="`cat conftestval`" + ],[ + AC_MSG_WARN([Failed to build/run program to determine Fortran logical values.]) + ],[ + # Cross-Compiling. Allow the user to set the values + if test -n "$CROSS_F77_TRUE_VALUE" -a -n "$CROSS_F77_FALSE_VALUE" ; then + pac_cv_prog_f77_true_false_value="$CROSS_F77_TRUE_VALUE $CROSS_F77_FALSE_VALUE" + else + AC_MSG_WARN([Either CROSS_F77_TRUE_VALUE="$CROSS_F77_TRUE_VALUE" or CROSS_F77_FALSE_VALUE="$CROSS_F77_FALSE_VALUE" is not set.]) + fi + ]) + AC_LANG_POP([Fortran 77]) + LIBS="$saved_LIBS" + rm -f pac_conftest.$OBJEXT +]) +AC_LANG_POP([C]) +]) +dnl Endof ac_cache_val +if test "X$pac_cv_prog_f77_true_false_value" != "X" ; then + true_val="`echo $pac_cv_prog_f77_true_false_value | sed -e 's/ .*//g'`" + false_val="`echo $pac_cv_prog_f77_true_false_value | sed -e 's/.* *//g'`" + if test -n "$true_val" -a -n "$false_val" ; then + AC_MSG_RESULT([True is $true_val and False is $false_val]) + else + AC_MSG_RESULT([could not determine]) + fi +fi +if test -n "$true_val" -a -n "$false_val" ; then + AC_DEFINE(F77_TRUE_VALUE_SET,1,[Define if we know the value of Fortran true and false]) + AC_DEFINE_UNQUOTED(F77_TRUE_VALUE,$true_val,[The value of true in Fortran]) + AC_DEFINE_UNQUOTED(F77_FALSE_VALUE,$false_val,[The value of false in Fortran]) +fi +]) +dnl/*D +dnl PAC_PROG_F77_MISMATCHED_ARGS([option],[AllOnly]) - Determine whether the +dnl Fortran compiler allows routines to be called with different +dnl argument types. If not, attempts to determine a command-line argument +dnl that permits such use +dnl (The Fortran standard prohibits this usage) +dnl +dnl option is set to the compiler option to use. +dnl if AllOnly is yes (literal, not variable with value), then only consider +dnl options that turn off checking +dnl for all routines +dnl +dnl The NAG Fortran compiler, nagfor, is known to enforce this part of the +dnl Fortran standard. +dnl D*/ +AC_DEFUN([PAC_PROG_F77_MISMATCHED_ARGS],[ +AC_MSG_CHECKING([whether $F77 allows mismatched arguments]) +if test "X$pac_cv_prog_f77_mismatched_args" = X ; then + pac_cv_prog_f77_mismatched_args_parm="" + pac_cv_prog_f77_mismatched_args=no + AC_LANG_PUSH([Fortran 77]) + AC_COMPILE_IFELSE([ + AC_LANG_SOURCE([ + program main + integer a + real b + character c + call foo1(a) + call foo1(b) + call foo1(c) + end +])],[pac_cv_prog_f77_mismatched_args=yes]) + if test "$pac_cv_prog_f77_mismatched_args" != "yes" ; then + # try again with -wmismatch=foo1 + save_FFLAGS="$FFLAGS" + # The best solution is to turn off errors on particular routines + # if that isn't possible (e.g., too many of them), then + # just try arguments that turn off all checking + for flags in ifelse($2,yes,,"-wmismatch=foo1") "-mismatch" ; do + testok=no + FFLAGS="$FFLAGS $flags" + AC_COMPILE_IFELSE([ + AC_LANG_SOURCE([ + program main + integer a + real b + character c + call foo1(a) + call foo1(b) + call foo1(c) + end +])],[testok=yes]) + FFLAGS="$save_FFLAGS" + if test "$testok" = yes ; then break ; fi + done + if test "$testok" = yes ; then + pac_cv_prog_f77_mismatched_args_parm="$flags" + pac_cv_prog_f77_mismatched_args="yes, with $pac_cv_prog_f77_mismatched_args_parm" + fi + fi + AC_LANG_POP([Fortran 77]) +fi +AC_MSG_RESULT($pac_cv_prog_f77_mismatched_args) +if test "$pac_cv_prog_f77_mismatched_args" = no ; then + AC_MSG_ERROR([The Fortran compiler $F77 will not compile files that call +the same routine with arguments of different types.]) +fi + +ifelse($1,,,[$1=$pac_cv_prog_f77_mismatched_args_parm]) +]) diff --git a/ompi/mca/io/romio/romio/confdb/aclocal_f77old.m4 b/ompi/mca/io/romio/romio/confdb/aclocal_f77old.m4 new file mode 100644 index 0000000000..5cbe91a6b8 --- /dev/null +++ b/ompi/mca/io/romio/romio/confdb/aclocal_f77old.m4 @@ -0,0 +1,389 @@ +dnl/*D +dnl PAC_PROG_F77_CMDARGS - Determine how to access the command line from +dnl Fortran 77 +dnl +dnl Output Effects: +dnl The following variables are set: +dnl.vb +dnl F77_GETARG - Statement to get an argument i into string s +dnl F77_IARGC - Routine to return the number of arguments +dnl FXX_MODULE - Module command when using Fortran 90 compiler +dnl F77_GETARGDECL - Declaration of routine used for F77_GETARG +dnl F77_GETARG_FFLAGS - Flags needed when compiling/linking +dnl F77_GETARG_LDFLAGS - Flags needed when linking +dnl.ve +dnl If 'F77_GETARG' has a value, then that value and the values for these +dnl other symbols will be used instead. If no approach is found, all of these +dnl variables will have empty values. +dnl If no other approach works and a file 'f77argdef' is in the directory, +dnl that file will be sourced for the values of the above four variables. +dnl +dnl In most cases, you should add F77_GETARG_FFLAGS to the FFLAGS variable +dnl and F77_GETARG_LDFLAGS to the LDFLAGS variable, to ensure that tests are +dnl performed on the compiler version that will be used. +dnl +dnl 'AC_SUBST' is called for all six variables. +dnl +dnl One complication is that on systems with multiple Fortran compilers, +dnl some libraries used by one Fortran compiler may have been (mis)placed +dnl in a common location. We have had trouble with libg2c in particular. +dnl To work around this, we test whether iargc etc. work first. This +dnl will catch most systems and will speed up the tests. +dnl +dnl Next, the libraries are only added if they are needed to complete a +dnl link; they aren''t added just because they exist. +dnl +dnl f77argdef +dnl D*/ +dnl +dnl Random notes +dnl You can export the command line arguments from C to the g77 compiler +dnl using +dnl extern char **__libc_argv; +dnl extern int __libc_argc; +dnl f_setarg( __libc_argc, __libc_argv ); +dnl +AC_DEFUN([PAC_PROG_F77_CMDARGS],[ +found_cached="yes" +AC_MSG_CHECKING([for routines to access the command line from Fortran 77]) +AC_CACHE_VAL(pac_cv_prog_f77_cmdarg, +[ + AC_MSG_RESULT([searching...]) + found_cached="no" + # First, we perform a quick check. Does iargc and getarg work? + fxx_module="${FXX_MODULE:-}" + f77_getargdecl="${F77_GETARGDECL:-external getarg}" + f77_getarg="${F77_GETARG:-call GETARG(i,s)}" + f77_iargc="${F77_IARGC:-IARGC()}" + # + # Grumble. The Absoft Fortran compiler computes i - i as 0 and then + # 1.0 / 0 at compile time, even though the code may never be executed. + # What we need is a way to generate an error, so the second usage of i + # was replaced with f77_iargc. + cat > conftest.f </dev/null 2>&1 ; then + found_answer="yes" + FXX_MODULE="$fxx_module" + F77_GETARGDECL="$f77_getargdecl" + F77_GETARG="$f77_getarg" + F77_IARGC="$f77_iargc" + AC_MSG_RESULT(yes) + fi + fi + fi + if test $found_answer = "no" ; then + AC_MSG_RESULT(no) + # Grumph. Here are a bunch of different approaches + # We have several axes the check: + # Library to link with (none, -lU77 (HPUX), -lg2c (LINUX f77)) + # PEPCF90 (Intel ifc) + # The first line is a dummy + # (we experimented with using a , but this caused other + # problems because we need in the IFS) + trial_LIBS="0 -lU77 -lPEPCF90" + if test "$NOG2C" != "1" ; then + trial_LIBS="$trial_LIBS -lg2c" + fi + # Discard libs that are not availble: + save_IFS="$IFS" + # Make sure that IFS includes a space, or the tests that run programs + # may fail + IFS=" "" +" + save_trial_LIBS="$trial_LIBS" + trial_LIBS="" + cat > conftest.f <, the space is important + # To make the Absoft f77 and f90 work together, we need to prefer the + # upper case versions of the arguments. They also require libU77. + # -YCFRL=1 causes Absoft f90 to work with g77 and similar (f2c-based) + # Fortran compilers + # + # Problem: The Intel efc compiler hangs when presented with -N109 . + # The only real fix for this is to detect this compiler and exclude + # the test. We may want to reorganize these tests so that if we + # can compile code without special options, we never look for them. + # + using_intel_efc="no" + pac_test_msg=`$F77 -V 2>&1 | grep 'Intel(R) Fortran Itanium'` + if test "$pac_test_msg" != "" ; then + using_intel_efc="yes" + fi + if test "$using_intel_efc" = "yes" ; then + trial_FLAGS="000" + else + trial_FLAGS="000 +-N109 +-f +-YEXT_NAMES=UCS +-YEXT_NAMES=LCS +-YCFRL=1 ++U77" + fi + # Discard options that are not available: + # (IFS already saved above) + IFS=" "" +" + save_trial_FLAGS="$trial_FLAGS" + trial_FLAGS="" + for flag in $save_trial_FLAGS ; do + if test "$flag" = " " -o "$flag" = "000" ; then + opt_ok="yes" + else + PAC_F77_CHECK_COMPILER_OPTION($flag,opt_ok=yes,opt_ok=no) + fi + if test "$opt_ok" = "yes" ; then + if test "$flag" = " " -o "$flag" = "000" ; then + fflag="" + else + fflag="$flag" + fi + # discard options that don't allow mixed-case name matching + cat > conftest.f < conftest.f </dev/null 2>&1 ; then + found_answer="yes" + fi + else + found_answer="yes" + fi + fi + IFS=" "" +" + if test "$found_answer" = "yes" ; then + AC_MSG_RESULT([yes]) + pac_cv_prog_f77_cmdarg="$MSG" + pac_cv_prog_f77_cmdarg_fflags="$flags" + pac_cv_prog_f77_cmdarg_ldflags="$libs" + break + else + AC_MSG_RESULT([no]) + echo "configure: failed program was:" >&AC_FD_CC + cat conftest.f >&AC_FD_CC + fi + done + done + IFS="$save_IFS" + rm -f conftest.* + trial=`expr $trial + 1` + done +fi +pac_cv_F77_GETARGDECL="$F77_GETARGDECL" +pac_cv_F77_IARGC="$F77_IARGC" +pac_cv_F77_GETARG="$F77_GETARG" +pac_cv_FXX_MODULE="$FXX_MODULE" +]) +if test "$found_cached" = "yes" ; then + AC_MSG_RESULT([$pac_cv_prog_f77_cmdarg]) +elif test -z "$pac_cv_F77_IARGC" ; then + AC_MSG_WARN([Could not find a way to access the command line from Fortran 77]) +fi +# Set the variable values based on pac_cv_prog_xxx +F77_GETARGDECL="$pac_cv_F77_GETARGDECL" +F77_IARGC="$pac_cv_F77_IARGC" +F77_GETARG="$pac_cv_F77_GETARG" +FXX_MODULE="$pac_cv_FXX_MODULE" +F77_GETARG_FFLAGS="$pac_cv_prog_f77_cmdarg_fflags" +F77_GETARG_LDFLAGS="$pac_cv_prog_f77_cmdarg_ldflags" +AC_SUBST(F77_GETARGDECL) +AC_SUBST(F77_IARGC) +AC_SUBST(F77_GETARG) +AC_SUBST(FXX_MODULE) +AC_SUBST(F77_GETARG_FFLAGS) +AC_SUBST(F77_GETARG_LDFLAGS) +]) diff --git a/ompi/mca/io/romio/romio/confdb/aclocal_fc.m4 b/ompi/mca/io/romio/romio/confdb/aclocal_fc.m4 index f5e598dc05..dfd98c6c83 100644 --- a/ompi/mca/io/romio/romio/confdb/aclocal_fc.m4 +++ b/ompi/mca/io/romio/romio/confdb/aclocal_fc.m4 @@ -1,3 +1,8 @@ +dnl PAC_FC_SEARCH_LIST - expands to a whitespace separated list of modern +dnl fortran compilers for use with AC_PROG_FC that is more suitable for HPC +dnl software packages +AC_DEFUN([PAC_FC_SEARCH_LIST], + [ifort pgf90 pathf90 pathf95 xlf90 xlf95 xlf2003 gfortran f90 epcf90 f95 fort lf95 g95 ifc efc gfc]) dnl /*D dnl PAC_PROG_FC([COMPILERS]) dnl @@ -15,7 +20,7 @@ dnl It is believed that under HP-UX `fort77' is the name of the native dnl compiler. On some Cray systems, fort77 is a native compiler. dnl frt is the Fujitsu F77 compiler. dnl pgf77 and pgf90 are the Portland Group F77 and F90 compilers. -dnl xlf/xlf90/xlf95 are IBM (AIX) F77/F90/F95 compilers. +dnl xlf/xlf90/xlf95/xlf2003 are IBM (AIX) F77/F90/F95/F2003 compilers. dnl lf95 is the Lahey-Fujitsu compiler. dnl fl32 is the Microsoft Fortran "PowerStation" compiler. dnl af77 is the Apogee F77 compiler for Intergraph hardware running CLIX. @@ -28,12 +33,14 @@ dnl ifc - An older Intel compiler dnl fc - A compiler on some unknown system. This has been removed because dnl it may also be the name of a command for something other than dnl the Fortran compiler (e.g., fc=file system check!) +dnl gfortran - The GNU Fortran compiler (not the same as g95) +dnl gfc - An alias for gfortran recommended in cygwin installations dnl D*/ +dnl NOTE: this macro suffers from a basically intractable "expanded before it +dnl was required" problem when libtool is also used AC_DEFUN([PAC_PROG_FC],[ PAC_PUSH_FLAG([FCFLAGS]) -AC_PROG_FC([m4_default([$1], - [ifort pgf90 pathf90 pathf95 xlf90 xlf95 f90 epcf90 f95 fort lf95 \ - gfortran g95 ifc efc])]) +AC_PROG_FC([m4_default([$1],[PAC_FC_SEARCH_LIST])]) PAC_POP_FLAG([FCFLAGS]) ]) dnl @@ -111,6 +118,7 @@ AC_DEFUN([PAC_PROG_FC_INT_KIND],[ # Set the default $1=-1 if test "$pac_cv_prog_fc_cross" = "yes" ; then + AS_IF([test -z "$3"],[AC_MSG_ERROR(['$3' is empty])]) $1="$3" else AC_LANG_PUSH(Fortran) @@ -239,9 +247,9 @@ dnl dnl dnl PAC_FC_MODULE_INCFLAG AC_DEFUN([PAC_FC_MODULE_INCFLAG],[ +AC_REQUIRE([PAC_FC_MODULE_EXT]) AC_CACHE_CHECK([for Fortran 90 module include flag], pac_cv_fc_module_incflag,[ -AC_REQUIRE([PAC_FC_MODULE_EXT]) AC_LANG_PUSH(Fortran) AC_LANG_CONFTEST([ AC_LANG_SOURCE([ @@ -273,9 +281,7 @@ AC_COMPILE_IFELSE([],[ # cat conftest.$ac_ext >&AS_MESSAGE_LOG_FD _AC_MSG_LOG_CONFTEST fi - ], - [] -) +],[]) # Remove the conftest* after AC_LANG_CONFTEST rm -rf conftest.dSYM rm -f conftest.$ac_ext @@ -343,8 +349,96 @@ dnl AC_DEFUN([PAC_FC_MODULE],[ PAC_FC_MODULE_EXT PAC_FC_MODULE_INCFLAG +PAC_FC_MODULE_OUTFLAG ]) dnl +dnl PAC_FC_MODULE_OUTFLAG +AC_DEFUN([PAC_FC_MODULE_OUTFLAG],[ +AC_REQUIRE([PAC_FC_MODULE_EXT]) +AC_CACHE_CHECK([for Fortran 90 module output directory flag], + [pac_cv_fc_module_outflag], +[ +AC_LANG_PUSH([Fortran]) +AC_LANG_CONFTEST([ + AC_LANG_SOURCE([ + module conf + integer n + parameter (n=1) + end module conf + ]) +]) +pac_madedir="no" +if test ! -d conf ; then mkdir conftestdir ; pac_madedir="yes"; fi +if test "$pac_cv_fc_module_case" = "upper" ; then + pac_module="CONF.$pac_cv_fc_module_ext" +else + pac_module="conf.$pac_cv_fc_module_ext" +fi + +# check base case that the compiler can create modules and that they endup in +# the current directory +AC_COMPILE_IFELSE([],[ + if test -s "$pac_module" ; then + rm -f "$pac_module" + # Remove any temporary files, and hide the work.pc file + # (if the compiler generates them) + if test -f work.pc ; then + mv -f work.pc conftest.pc + fi + rm -f work.pcl + else + AC_MSG_WARN([Unable to build a simple Fortran 90 module]) + # echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD + # cat conftest.$ac_ext >&AS_MESSAGE_LOG_FD + _AC_MSG_LOG_CONFTEST + fi +],[]) + +# known flags for reasonably recent versions of various f90 compilers: +# gfortran -J${dir} +# xlf -qmoddir=${dir} +# pgf90 -module ${dir} +# ifort -module ${dir} +# nagfor -mdir ${dir} +# ftn -J ${dir} ## the Cray fortran compiler +# f95 -YMOD_OUT_DIR=${dir} ## the Absoft fortran compiler +# lf95 -Am -mod ${dir} ## the Lahey/Fujitsu fortran compiler +# f90 -moddir=${dir} ## the Sun f90 compiler +# g95 -fmod=${dir} +# +# If there are any compilers still out there that are totally brain-dead and +# don't support an output directory flag, we can write a wrapper script to tell +# users to use. Alternatively they can use an older version of MPICH. + +pac_cv_fc_module_outflag= +for mod_flag in '-J' '-J ' '-qmoddir=' '-module ' '-YMOD_OUT_DIR=' '-mdir ' '-moddir=' '-fmod=' ; do + rm -f conftestdir/NONEXISTENT conftestdir/* + PAC_PUSH_FLAG([FCFLAGS]) + FCFLAGS="$FCFLAGS ${mod_flag}conftestdir" + AC_COMPILE_IFELSE([],[pac_build_success=yes],[pac_build_success=no]) + AS_IF([test "X$pac_build_success" = Xyes], + [AS_IF([test -s "conftestdir/${pac_module}"], + [pac_cv_fc_module_outflag="$mod_flag"])]) + PAC_POP_FLAG([FCFLAGS]) + AS_IF([test "X$pac_cv_fc_module_outflag" = X],[:],[break]) +done + +# Remove the conftest* after AC_LANG_CONFTEST +rm -rf conftest.dSYM +rm -f conftest.$ac_ext + +if test "$pac_madedir" = "yes" ; then rm -rf conftestdir ; fi +AS_UNSET([pac_madedir]) +# Remove the conftest* after AC_LANG_CONFTEST +# This is needed for Mac OSX 10.5 +rm -rf conftest.dSYM +rm -f conftest* +AC_LANG_POP(Fortran) +])dnl end AC_CACHE_CHECK + +AC_SUBST([FCMODOUTFLAG],[$pac_cv_fc_module_outflag]) +])dnl end AC_DEFUN([PAC_FC_MODULE_OUTFLAG]) +dnl dnl PAC_FC_AND_F77_COMPATIBLE([action-if-true],[action-if-false]) dnl dnl Determine whether object files compiled with Fortran 77 can be @@ -374,7 +468,7 @@ AC_COMPILE_IFELSE([ ]) ],[ # pac_f77compile_ok=yes - mv conftest.$OBJEXT pac_f77conftest.$OBJEXT + PAC_RUNLOG([mv conftest.$OBJEXT pac_f77conftest.$OBJEXT]) # Save original LIBS, prepend previously generated object file to LIBS saved_LIBS="$LIBS" LIBS="pac_f77conftest.$OBJEXT $LIBS" @@ -413,38 +507,61 @@ dnl dnl dnl dnl /*D -dnl PAC_PROG_FC_HAS_POINTER - Determine if Fortran allows pointer type +dnl PAC_PROG_FC_CRAY_POINTER - Check if Fortran supports Cray-style pointer. +dnl If so, set pac_cv_prog_fc_has_pointer to yes +dnl and find out if any extra compiler flag is +dnl needed and set it as CRAYPTR_FCFLAGS. +dnl i.e. CRAYPTR_FCFLAGS is meaningful only if +dnl pac_cv_prog_fc_has_pointer = yes. dnl dnl Synopsis: -dnl PAC_PROG_FC_HAS_POINTER(action-if-true,action-if-false) +dnl PAC_PROG_FC_CRAY_POINTER([action-if-true],[action-if-false]) dnl D*/ -AC_DEFUN([PAC_PROG_FC_HAS_POINTER],[ -AC_CACHE_CHECK([whether Fortran 90 has Cray-style pointer declaration], +AC_DEFUN([PAC_PROG_FC_CRAY_POINTER],[ +AC_CACHE_CHECK([whether Fortran 90 supports Cray-style pointer], pac_cv_prog_fc_has_pointer,[ -AC_LANG_PUSH(Fortran) -AC_COMPILE_IFELSE([ +AC_LANG_PUSH([Fortran]) +AC_LANG_CONFTEST([ AC_LANG_PROGRAM([],[ integer M pointer (MPTR,M) data MPTR/0/ ]) -],[ - pac_cv_prog_fc_has_pointer="yes" -],[ - pac_cv_prog_fc_has_pointer="no" -]) dnl Endof AC_COMPILE_IFELSE -AC_LANG_POP(Fortran) +]) +saved_FCFLAGS="$FCFLAGS" +pac_cv_prog_fc_has_pointer=no +CRAYPTR_FCFLAGS="" +for ptrflag in '' '-fcray-pointer' ; do + FCFLAGS="$saved_FCFLAGS $ptrflag" + AC_COMPILE_IFELSE([],[ + pac_cv_prog_fc_has_pointer=yes + CRAYPTR_FCFLAGS="$ptrflag" + break + ]) +done +dnl Restore FCFLAGS first, since user may not want to modify FCFLAGS +FCFLAGS="$saved_FCFLAGS" +dnl remove conftest after ac_lang_conftest +rm -f conftest.$ac_ext +AC_LANG_POP([Fortran]) ]) if test "$pac_cv_prog_fc_has_pointer" = "yes" ; then - ifelse([$1],,:,[$1]) + AC_MSG_CHECKING([for Fortran 90 compiler flag for Cray-style pointer]) + if test "X$CRAYPTR_FCFLAGS" != "X" ; then + AC_MSG_RESULT([$CRAYPTR_FCFLAGS]) + else + AC_MSG_RESULT([none]) + fi + ifelse([$1],[],[:],[$1]) else - ifelse([$2],,:,[$2]) + ifelse([$2],[],[:],[$2]) fi ]) dnl dnl dnl AC_DEFUN([PAC_PROG_FC_AND_C_STDIO_LIBS],[ +AC_REQUIRE([AC_HEADER_STDC]) # To simply the code in the cache_check macro, chose the routine name # first, in case we need it confname=conf1_ @@ -464,13 +581,15 @@ pac_cv_prog_fc_and_c_stdio_libs=unknown AC_LANG_PUSH(C) AC_COMPILE_IFELSE([ AC_LANG_SOURCE([ +#if defined(HAVE_STDIO_H) || defined(STDC_HEADERS) #include +#endif int $confname( int a ) { printf( "The answer is %d\n", a ); fflush(stdout); return 0; } ]) ],[ pac_compile_ok=yes - mv conftest.$OBJEXT pac_conftest.$OBJEXT + PAC_RUNLOG([mv conftest.$OBJEXT pac_conftest.$OBJEXT]) # Save LIBS and prepend object file to LIBS saved_LIBS="$LIBS" LIBS="pac_conftest.$OBJEXT $LIBS" @@ -525,41 +644,17 @@ AC_DEFUN([PAC_FC_CHECK_COMPILER_OPTION],[ AC_MSG_CHECKING([whether Fortran 90 compiler accepts option $1]) pac_opt="$1" AC_LANG_PUSH(Fortran) -dnl Instead of defining our own ac_link and ac_compile and do AC_TRY_EVAL -dnl on these variables. We modify ac_link and ac_compile used by AC_*_IFELSE -dnl by piping the output of the command to a logfile. The reason is that -dnl 1) AC_TRY_EVAL is discouraged by Autoconf. 2) defining our ac_link and -dnl ac_compile could mess up the usage and order of FCFLAGS, LDFLAGS -dnl and LIBS in these commands, i.e. deviate from how GNU standard uses -dnl these variables. -dnl -dnl Replace " >&AS_MESSAGE_LOG_FD" by "> file 2>&1" in ac_link and ac_compile -pac_link="`echo $ac_link | sed -e 's|>.*$|> $pac_logfile 2>\&1|g'`" -dnl echo "ac_link=\"$ac_link\"" -dnl echo "pac_link=\"$pac_link\"" -saved_ac_link="$ac_link" -ac_link="$pac_link" -dnl echo "ac_link=\"$ac_link\"" - -pac_compile="`echo $ac_compile | sed -e 's|>.*$|> $pac_logfile 2>\&1|g'`" -dnl echo "ac_compile=\"$ac_compile\"" -dnl echo "pac_compile=\"$pac_compile\"" -saved_ac_compile="$ac_compile" -ac_compile="$pac_compile" -dnl echo "ac_compile=\"$ac_compile\"" - FCFLAGS_orig="$FCFLAGS" FCFLAGS_opt="$pac_opt $FCFLAGS" pac_result="unknown" + AC_LANG_CONFTEST([AC_LANG_PROGRAM()]) FCFLAGS="$FCFLAGS_orig" -pac_logfile="pac_test1.log" -rm -f $pac_logfile -AC_LINK_IFELSE([], [ +rm -f pac_test1.log +PAC_LINK_IFELSE_LOG([pac_test1.log], [], [ FCFLAGS="$FCFLAGS_opt" - pac_logfile="pac_test2.log" - rm -f $pac_logfile - AC_LINK_IFELSE([], [ + rm -f pac_test2.log + PAC_LINK_IFELSE_LOG([pac_test2.log], [], [ PAC_RUNLOG_IFELSE([diff -b pac_test1.log pac_test2.log], [pac_result=yes], [pac_result=no]) ],[ @@ -576,23 +671,20 @@ if test "$pac_result" = "yes" ; then AC_MSG_CHECKING([whether routines compiled with $pac_opt can be linked with ones compiled without $pac_opt]) pac_result=unknown FCFLAGS="$FCFLAGS_orig" - pac_logfile="pac_test3.log" - rm -f $pac_logfile - AC_COMPILE_IFELSE([ + rm -f pac_test3.log + PAC_COMPILE_IFELSE_LOG([pac_test3.log], [ AC_LANG_SOURCE([ subroutine try() end ]) ],[ - mv conftest.$OBJEXT pac_conftest.$OBJEXT + PAC_RUNLOG([mv conftest.$OBJEXT pac_conftest.$OBJEXT]) saved_LIBS="$LIBS" LIBS="pac_conftest.$OBJEXT $LIBS" FCFLAGS="$FCFLAGS_opt" - pac_logfile="pac_test4.log" - rm -f $pac_logfile - AC_LINK_IFELSE([AC_LANG_PROGRAM()], [ - diffcmd='diff -b pac_test3.log pac_test4.log' + rm -f pac_test4.log + PAC_LINK_IFELSE_LOG([pac_test4.log], [AC_LANG_PROGRAM()], [ PAC_RUNLOG_IFELSE([diff -b pac_test2.log pac_test4.log], [pac_result=yes], [pac_result=no]) ],[ @@ -608,11 +700,6 @@ if test "$pac_result" = "yes" ; then fi rm -f pac_test1.log pac_test2.log -dnl Restore everything in AC that has been overwritten -ac_link="$saved_ac_link" -ac_compile="$saved_ac_compile" -dnl echo "ac_link=\"$ac_link\"" -dnl echo "ac_compile=\"$ac_compile\"" dnl Restore FCFLAGS before 2nd/3rd argument commands are executed, dnl as 2nd/3rd argument command could be modifying FCFLAGS. FCFLAGS="$FCFLAGS_orig" @@ -621,10 +708,6 @@ if test "$pac_result" = "yes" ; then else ifelse([$3],[],[:],[$3]) fi - -# This is needed for Mac OSX 10.5 -rm -rf conftest.dSYM -rm -f conftest* AC_LANG_POP(Fortran) ]) dnl /*D @@ -772,37 +855,46 @@ AC_DEFUN([PAC_FC_FLOAT_MODEL],[ type="$1" AC_MSG_CHECKING([for precision and range of $type]) AC_LANG_PUSH([Fortran]) -AC_LINK_IFELSE([ +rm -f pac_fconftest.out +AC_RUN_IFELSE([ AC_LANG_SOURCE([ program main $type aa - print *, precision(aa), ",", range(aa) + open(8, file="pac_fconftest.out", form="formatted") + write(8,*) precision(aa), ",", range(aa) + close(8) end ]) ],[ - rm -f pac_conftest.out - PAC_RUNLOG([./conftest$EXEEXT > pac_conftest.out]) - if test -s pac_conftest.out ; then - pac_fc_num_model="`cat pac_conftest.out | sed -e 's/ */ /g'`" + if test -s pac_fconftest.out ; then + pac_fc_num_model="`sed -e 's/ */ /g' pac_fconftest.out`" AC_MSG_RESULT([$pac_fc_num_model]) ifelse([$2],[],[],[$2=$pac_fc_num_model]) else + AC_MSG_RESULT([Error]) AC_MSG_WARN([No output from test program!]) fi - rm -f pac_conftest.out + rm -f pac_fconftest.out ],[ - AC_MSG_WARN([Failed to build program to determine the precision and range of $type]) + AC_MSG_RESULT([Error]) + AC_MSG_WARN([Failed to run program to determine the precision and range of $type]) ]) AC_LANG_POP([Fortran]) ]) dnl -dnl PAC_FC_SIMPLE_NUMBER_MODEL(message,test-fc-code, -dnl [variable-set-if-successful-test]) -dnl message : message of what test-fc-code is checking -dnl test-fc-code : Fortran 90 code to check a float or integer type's data model +dnl PAC_FC_SIMPLE_NUMBER_MODEL(message, Fortran-type, Fortran-write, +dnl [variable-set-if-successful-test], +dnl [cross-value]) +dnl +dnl message : message of what test-fc-code is checking +dnl Fortran-type : Fortran90 type's data model to be examined. +dnl Fortran-write : Fortran90 type's write statement used with write(N,*). dnl variable-set-if-successful-test : -dnl The optional variable to be set if the test-fc-code -dnl is successful in returning the simple data model. +dnl The optional variable to be set if the codelet: +dnl "Fortran-type" + "write(N,*) Fortran-write" +dnl is successful in returning the simple data model. +dnl cross-value : value to be used for above variable when +dnl cross_compiling=yes dnl dnl This is a runtime test. dnl @@ -810,45 +902,60 @@ AC_DEFUN([PAC_FC_SIMPLE_NUMBER_MODEL],[ pac_msg="$1" AC_MSG_CHECKING([for $pac_msg]) AC_LANG_PUSH([Fortran]) -AC_LINK_IFELSE([ - AC_LANG_PROGRAM([],[ +rm -f pac_fconftest.out +AC_RUN_IFELSE([ + AC_LANG_SOURCE([ + program main $2 + open(8, file="pac_fconftest.out", form="formatted") + write(8,*) $3 + close(8) + end ]) ],[ - rm -f pac_conftest.out - PAC_RUNLOG([./conftest$EXEEXT > pac_conftest.out]) - if test -s pac_conftest.out ; then - pac_fc_num_model="`cat pac_conftest.out | sed -e 's/ */ /g'`" + if test -s pac_fconftest.out ; then + pac_fc_num_model="`sed -e 's/ */ /g' pac_fconftest.out`" AC_MSG_RESULT([$pac_fc_num_model]) - ifelse([$3],[],[],[$3=$pac_fc_num_model]) + ifelse([$4],[],[],[$4=$pac_fc_num_model]) else + AC_MSG_RESULT([Error]) AC_MSG_WARN([No output from test program!]) fi - rm -f pac_conftest.out + rm -f pac_fconftest.out ],[ - AC_MSG_WARN([Failed to build program to determine $pac_msg]) + AC_MSG_RESULT([Error]) + AC_MSG_WARN([Failed to run program to determine $pac_msg]) +],[ + AC_MSG_RESULT([$5]) + ifelse([$4],[],[],[$4=$5]) ]) AC_LANG_POP([Fortran]) ]) dnl -dnl PAC_FC_AVAIL_INTEGER_MODELS([INTEGER-MODELS-FLAG]) -dnl Both INTEGER-MODELS-FLAG is an optional variable to be set if provided. -dnl If it isn't provided, PAC_FC_ALL_INTEGER_MODELS will be set. +dnl PAC_FC_AVAIL_INTEGER_MODELS([INTEGER-MODELS-FLAG],[CROSS-VARIABLE]) +dnl +dnl INTEGER-MODELS-FLAG : an optional variable to be set if provided. +dnl If it isn't provided, PAC_FC_ALL_INTEGER_MODELS +dnl will be set. +dnl CROSS-VALUE : value will be used to set INTEGER-MODELS-FLAG +dnl or PAC_FC_ALL_INTEGER_MODELS if cross_compiling=yes. dnl dnl This is a runtime test. dnl AC_DEFUN([PAC_FC_AVAIL_INTEGER_MODELS],[ AC_MSG_CHECKING([for available integer kinds]) AC_LANG_PUSH([Fortran]) -AC_LINK_IFELSE([ +rm -f pac_fconftest.out +AC_RUN_IFELSE([ AC_LANG_SOURCE([ program main integer r, lastkind lastkind=selected_int_kind(1) + open(8, file="pac_fconftest.out", form="formatted") do r=2,30 k = selected_int_kind(r) if (k .ne. lastkind) then - print *, r-1,",",lastkind + write(8,*) r-1, ",", lastkind lastkind = k endif if (k .le. 0) then @@ -856,33 +963,44 @@ AC_LINK_IFELSE([ endif enddo if (k.ne.lastkind) then - print *, 31, ",", k + write(8,*) 31, ",", k endif + close(8) end ]) ],[ - rm -f pac_conftest.out - PAC_RUNLOG([./conftest$EXEEXT > pac_conftest.out]) - if test -s pac_conftest.out ; then - pac_flag=`cat pac_conftest.out | sed -e 's/ */ /g'| tr '\012' ','` + if test -s pac_fconftest.out ; then + pac_flag="`sed -e 's/ */ /g' pac_fconftest.out | tr '\012' ','`" AC_MSG_RESULT([$pac_flag]) - pac_validKinds="`sed -e 's/ */ /g' pac_conftest.out | tr '\012' ':'`" + pac_validKinds="`sed -e 's/ */ /g' pac_fconftest.out | tr '\012' ':'`" ifelse([$1],[],[PAC_FC_ALL_INTEGER_MODELS=$pac_flag],[$1=$pac_flag]) else + AC_MSG_RESULT([Error]) AC_MSG_WARN([No output from test program!]) fi - rm -f pac_conftest.out + rm -f pac_fconftest.out ],[ - AC_MSG_WARN([Failed to build program to determine available integer models]) + AC_MSG_RESULT([Error]) + AC_MSG_WARN([Failed to run program to determine available integer models]) +],[ + dnl Even when cross_compiling=yes, + dnl pac_validKinds needs to be set for PAC_FC_INTEGER_MODEL_MAP() + pac_validKinds="`echo \"$2\" | tr ',' ':'`" + AC_MSG_RESULT([$2]) + ifelse([$1],[],[PAC_FC_ALL_INTEGER_MODELS=$2],[$1=$2]) ]) AC_LANG_POP([Fortran]) ]) dnl -dnl PAC_FC_INTEGER_MODEL_MAP([INTEGER-MODEL-MAP-FLAG]) -dnl Both INTEGER-MODEL-MAP-FLAG is an optional variable to be set if provided. -dnl If it isn't provided, PAC_FC_INTEGER_MODEL_MAP will be set. +dnl PAC_FC_INTEGER_MODEL_MAP([INTEGER-MODEL-MAP-FLAG],[CROSS-VALUE])) dnl -dnl This test expect pac_validKinds set by PAC_FC_ALL_INTEGER_MODELS. +dnl INTEGER-MODEL-MAP-FLAG : an optional variable to be set if provided. +dnl If it isn't provided, PAC_FC_INTEGER_MODEL_MAP +dnl will be set. +dnl CROSS-VALUE : value will be used to set INTEGER-MODEL-MAP-FLAG +dnl or PAC_FC_INTEGER_MODEL_MAP if cross_compiling=yes. +dnl +dnl This test requires $pac_validKinds set by PAC_FC_ALL_INTEGER_MODELS(). dnl dnl This is a runtime test. dnl @@ -893,8 +1011,6 @@ AC_MSG_CHECKING([for available integer ranges]) AC_LANG_PUSH([C]) AC_COMPILE_IFELSE([ AC_LANG_SOURCE([ -#include -#include "confdefs.h" #ifdef F77_NAME_UPPER #define cisize_ CISIZE #define isize_ ISIZE @@ -933,23 +1049,26 @@ if test "$pac_ccompile_ok" = "yes" ; then program main integer (kind=$kind) a(2) integer cisize - print *, $range, ",", $kind, ",", cisize( a(1), a(2) ) + open(8, file="pac_fconftest.out", form="formatted") + write(8,*) $range, ",", $kind, ",", cisize( a(1), a(2) ) + close(8) end ]) ]) IFS=$saved_IFS - AC_LINK_IFELSE([],[ - rm -f pac_conftest.out - PAC_RUNLOG([./conftest$EXEEXT > pac_conftest.out]) - if test -s pac_conftest.out ; then - sizes="`cat pac_conftest.out | sed -e 's/ */ /g'`" + rm -f pac_fconftest.out + AC_RUN_IFELSE([],[ + if test -s pac_fconftest.out ; then + sizes="`sed -e 's/ */ /g' pac_fconftest.out`" pac_flag="$pac_flag { $sizes }," else AC_MSG_WARN([No output from test program!]) fi - rm -f pac_conftest.out + rm -f pac_fconftest.out ],[ - AC_MSG_WARN([Fortran program fails to build!]) + AC_MSG_WARN([Fortran program fails to build or run!]) + ],[ + pac_flag="$2" ]) IFS=: done diff --git a/ompi/mca/io/romio/romio/confdb/aclocal_libs.m4 b/ompi/mca/io/romio/romio/confdb/aclocal_libs.m4 index b06d1d332e..8400977375 100644 --- a/ompi/mca/io/romio/romio/confdb/aclocal_libs.m4 +++ b/ompi/mca/io/romio/romio/confdb/aclocal_libs.m4 @@ -1,57 +1,109 @@ -dnl PAC_SET_HEADER_LIB_PATH(with_option) +dnl PAC_SET_HEADER_LIB_PATH(with_option,[default_path]) dnl This macro looks for the --with-xxx=, --with-xxx-include and --with-xxx-lib= dnl options and sets the library and include paths. +dnl +dnl TODO as written, this macro cannot handle a "with_option" arg that has "-" +dnl characters in it. Use AS_TR_SH (and possibly AS_VAR_* macros) to handle +dnl this case if it ever arises. AC_DEFUN([PAC_SET_HEADER_LIB_PATH],[ - AC_ARG_WITH($1, - AC_HELP_STRING([--with-$1=path], - [specify path where $1 include directory and lib directory can be found]), - if test "${with_$1}" != "yes" -a "${with_$1}" != "no" ; then - # is adding lib64 by default really the right thing to do? What if - # we are on a 32-bit host that happens to have both lib dirs available? - LDFLAGS="$LDFLAGS -L${with_$1}/lib64 -L${with_$1}/lib" - CPPFLAGS="$CPPFLAGS -I${with_$1}/include" - WRAPPER_CFLAGS="$WRAPPER_CFLAGS -I${with_$1}/include" - fi, - ) - AC_ARG_WITH($1-include, - AC_HELP_STRING([--with-$1-include=path], - [specify path where $1 include directory can be found]), - if test "${with_$1_include}" != "yes" -a "${with_$1_include}" != "no" ; then - CPPFLAGS="$CPPFLAGS -I${with_$1_include}" - WRAPPER_CFLAGS="$WRAPPER_CFLAGS -I${with_$1_include}" - fi, - ) - AC_ARG_WITH($1-lib, - AC_HELP_STRING([--with-$1-lib=path], - [specify path where $1 lib directory can be found]), - if test "${with_$1_lib}" != "yes" -a "${with_$1_lib}" != "no" ; then - LDFLAGS="$LDFLAGS -L${with_$1_lib}" - fi, - ) + AC_ARG_WITH([$1], + [AC_HELP_STRING([--with-$1=PATH], + [specify path where $1 include directory and lib directory can be found])], + + [AS_CASE(["$withval"], + [yes|no|''], + [AC_MSG_WARN([--with[out]-$1=PATH expects a valid PATH]) + with_$1=""])], + [with_$1=$2]) + AC_ARG_WITH([$1-include], + [AC_HELP_STRING([--with-$1-include=PATH], + [specify path where $1 include directory can be found])], + [AS_CASE(["$withval"], + [yes|no|''], + [AC_MSG_WARN([--with[out]-$1-include=PATH expects a valid PATH]) + with_$1_include=""])], + []) + AC_ARG_WITH([$1-lib], + [AC_HELP_STRING([--with-$1-lib=PATH], + [specify path where $1 lib directory can be found])], + [AS_CASE(["$withval"], + [yes|no|''], + [AC_MSG_WARN([--with[out]-$1-lib=PATH expects a valid PATH]) + with_$1_lib=""])], + []) + + # The args have been sanitized into empty/non-empty values above. + # Now append -I/-L args to CPPFLAGS/LDFLAGS, with more specific options + # taking priority + + AS_IF([test -n "${with_$1_include}"], + [PAC_APPEND_FLAG([-I${with_$1_include}],[CPPFLAGS]) + PAC_APPEND_FLAG([-I${with_$1_include}],[WRAPPER_CPPFLAGS])], + [AS_IF([test -n "${with_$1}"], + [PAC_APPEND_FLAG([-I${with_$1}/include],[CPPFLAGS]) + PAC_APPEND_FLAG([-I${with_$1}/include],[WRAPPER_CPPFLAGS])])]) + + AS_IF([test -n "${with_$1_lib}"], + [PAC_APPEND_FLAG([-L${with_$1_lib}],[LDFLAGS]) + PAC_APPEND_FLAG([-L${with_$1_lib}],[WRAPPER_LDFLAGS])], + [AS_IF([test -n "${with_$1}"], + dnl is adding lib64 by default really the right thing to do? What if + dnl we are on a 32-bit host that happens to have both lib dirs available? + [PAC_APPEND_FLAG([-L${with_$1}/lib64],[LDFLAGS]) + PAC_APPEND_FLAG([-L${with_$1}/lib64],[WRAPPER_LDFLAGS]) + PAC_APPEND_FLAG([-L${with_$1}/lib],[LDFLAGS]) + PAC_APPEND_FLAG([-L${with_$1}/lib],[WRAPPER_LDFLAGS])])]) ]) -dnl PAC_CHECK_HEADER_LIB(with_option, header.h, libname, function, action-if-yes, action-if-no) +dnl PAC_CHECK_HEADER_LIB(header.h, libname, function, action-if-yes, action-if-no) dnl This macro checks for a header and lib. It is assumed that the dnl user can specify a path to the includes and libs using --with-xxx=. dnl The xxx is specified in the "with_option" parameter. +dnl +dnl NOTE: This macro expects a corresponding PAC_SET_HEADER_LIB_PATH +dnl macro (or equivalent logic) to be used before this macro is used. AC_DEFUN([PAC_CHECK_HEADER_LIB],[ failure=no - AC_CHECK_HEADER([$2],,failure=yes) - AC_CHECK_LIB($3,$4,,failure=yes) + AC_CHECK_HEADER([$1],,failure=yes) + AC_CHECK_LIB($2,$3,,failure=yes) if test "$failure" = "no" ; then - $5 + $4 else - $6 + $5 fi ]) dnl PAC_CHECK_HEADER_LIB_FATAL(with_option, header.h, libname, function) dnl Similar to PAC_CHECK_HEADER_LIB, but errors out on failure AC_DEFUN([PAC_CHECK_HEADER_LIB_FATAL],[ - PAC_CHECK_HEADER_LIB($1,$2,$3,$4,success=yes,success=no) + PAC_CHECK_HEADER_LIB($2,$3,$4,success=yes,success=no) if test "$success" = "no" ; then AC_MSG_ERROR(['$2 or lib$3 library not found. Did you specify --with-$1= or --with-$1-include= or --with-$1-lib=?']) fi ]) + +dnl PAC_CHECK_PREFIX(with_option,prefixvar) +AC_DEFUN([PAC_CHECK_PREFIX],[ + AC_ARG_WITH([$1-prefix], + [AS_HELP_STRING([[--with-$1-prefix[=DIR]]], [use the $1 + library installed in DIR, rather than the + one included in the distribution. Pass + "embedded" to force usage of the included + $1 source.])], + [if test "$withval" = "system" ; then + : + elif test "$withval" = "embedded" ; then + : + else + PAC_APPEND_FLAG([-I${with_$1_prefix}/include],[CPPFLAGS]) + if test -d "${with_$1_prefix}/lib64" ; then + PAC_APPEND_FLAG([-L${with_$1_prefix}/lib64],[LDFLAGS]) + fi + PAC_APPEND_FLAG([-L${with_$1_prefix}/lib],[LDFLAGS]) + fi + ], + [with_$1_prefix="embedded"]) + ] +) diff --git a/ompi/mca/io/romio/romio/confdb/aclocal_mpi.m4 b/ompi/mca/io/romio/romio/confdb/aclocal_mpi.m4 index 79f47ec28b..4611109914 100644 --- a/ompi/mca/io/romio/romio/confdb/aclocal_mpi.m4 +++ b/ompi/mca/io/romio/romio/confdb/aclocal_mpi.m4 @@ -34,7 +34,7 @@ if test "X$pac_lib_mpi_is_building" != "Xyes" ; then fi fi # Look for MPILIB first if it is defined - AC_SEARCH_LIBS(MPI_Init,$MPILIB mpi mpich mpich2) + AC_SEARCH_LIBS(MPI_Init,$MPILIB mpi mpich mpich) if test "$ac_cv_search_MPI_Init" = "no" ; then ifelse($2,, AC_MSG_ERROR([Could not find MPI library]),[$2]) @@ -97,7 +97,7 @@ dnl it became necessary to define CC etc. before invoking AC_PROG_CC (and dnl the othe language compilers), because those commands now do much, much dnl more than just determining the compiler. dnl -dnl To address the change, we still define the TESTCC ect. compilers where +dnl To address the change, we still define the TESTCC etc. compilers where dnl possible to allow the use of AC_TRY_RUN when required, but we define dnl the CC etc variables and do not define ac_cv_prog_CC etc., as these dnl cause autoconf to skip all of the other initialization code that @@ -108,8 +108,12 @@ dnl See also: dnl PAC_LANG_PUSH_COMPILERS, PAC_LIB_MPI dnl D*/ AC_DEFUN([PAC_ARG_MPI_TYPES],[ +# known types PAC_ARG_MPI_KNOWN_TYPES +# find compilers +PAC_MPI_FIND_COMPILER_SCRIPTS PAC_MPI_FIND_COMPILERS +# check for MPI library PAC_MPI_CHECK_MPI_LIB ]) dnl @@ -121,8 +125,8 @@ AC_DEFUN([PAC_ARG_MPI_KNOWN_TYPES],[ AC_ARG_WITH(mpich, [--with-mpich=path - Assume that we are building with MPICH], ac_mpi_type=mpich) -# Allow MPICH2 as well as MPICH -AC_ARG_WITH(mpich2, +# Allow MPICH as well as MPICH +AC_ARG_WITH(mpich, [--with-mpich=path - Assume that we are building with MPICH], ac_mpi_type=mpich) AC_ARG_WITH(lammpi, @@ -152,7 +156,16 @@ if test "$ac_mpi_type" = "unknown" -a "$pac_lib_mpi_is_building" = "yes" ; then ac_mpi_type="mpich" fi ]) -AC_DEFUN([PAC_MPI_FIND_COMPILERS],[ +dnl +dnl Because of autoconf insists on moving code to the beginning of +dnl certain definitions, it is *not possible* to define a single command +dnl that selects compilation scripts and also check for other options. +dnl Thus, this needs to be divided into +dnl MPI_FIND_COMPILER_SCRIPTS +dnl which can fail (i.e., not find a script), and +dnl MPI_FIND_COMPILERS +dnl which runs the various PROC_xx for the compilers. +AC_DEFUN([PAC_MPI_FIND_COMPILER_SCRIPTS],[ # Set defaults MPIRUN_NP="-np " MPIEXEC_N="-n " @@ -222,7 +235,7 @@ case $ac_mpi_type in dnl This isn't correct. It should try to get the underlying compiler dnl from the mpicc and mpif77 scripts or mpireconfig if test "X$pac_lib_mpi_is_building" != "Xyes" ; then - save_PATH="$PATH" + PAC_PUSH_FLAG([PATH]) if test "$with_mpich" != "yes" -a "$with_mpich" != "no" ; then # Look for commands; if not found, try adding bin to the # path @@ -237,6 +250,8 @@ case $ac_mpi_type in # Note that autoconf may unconditionally change the value of # CC (!) in some other command. Thus, we define CCMASTER CCMASTER=$CC + # Force autoconf to respect this choice + ac_ct_CC=$CC # to permit configure codes to recover the correct CC. This # is an ugly not-quite-correct workaround for the fact that # does not want you to change the C compiler once you have set it @@ -256,7 +271,7 @@ case $ac_mpi_type in AC_PATH_PROG(MPIRUN,mpirun) AC_PATH_PROG(MPIBOOT,mpichboot) AC_PATH_PROG(MPIUNBOOT,mpichstop) - PATH="$save_PATH" + PAC_POP_FLAG([PATH]) MPILIBNAME="mpich" else # All of the above should have been passed in the environment! @@ -271,7 +286,7 @@ case $ac_mpi_type in dnl dnl This isn't correct. It should try to get the underlying compiler dnl from the mpicc and mpif77 scripts or mpireconfig - save_PATH="$PATH" + PAC_PUSH_FLAG([PATH]) if test "$with_mpich" != "yes" -a "$with_mpich" != "no" ; then # Look for commands; if not found, try adding bin to the path if test ! -x $with_lammpi/mpicc -a -x $with_lammpi/bin/mpicc ; then @@ -292,7 +307,7 @@ case $ac_mpi_type in AC_PATH_PROG(MPICXX,mpiCC) if test -z "$TESTCXX" ; then TESTCXX=${CXX-CC} ; fi CXX="$MPICXX" - PATH="$save_PATH" + PAC_POP_FLAG([PATH]) MPILIBNAME="lammpi" MPIBOOT="lamboot" MPIUNBOOT="wipe" @@ -330,43 +345,15 @@ case $ac_mpi_type in if test -z "$TESTF77" ; then TESTF77=${F77:=f77} ; fi if test -z "$TESTCXX" ; then TESTCXX=${CXX:=CC} ; fi if test -z "$TESTFC" ; then TESTFC=${FC:=f90} ; fi - AC_CHECK_LIB(mpi,MPI_Init) - if test "$ac_cv_lib_mpi_MPI_Init" = "yes" ; then - MPILIBNAME="mpi" - fi + # Must check for the MPI library in a separate macro - adding + # a test here will cause autoconf to prematurely define the + # C compiler MPIRUN=mpirun MPIBOOT="" MPIUNBOOT="" ;; generic) - # Find the compilers. Expect the compilers to be mpicc and mpif77 - # in $with_mpi/bin - PAC_PROG_CC - # We only look for the other compilers if there is no - # disable for them - if test "$enable_f77" != no -a "$enable_fortran" != no ; then - AC_PROG_F77 - fi - if test "$enable_cxx" != no ; then - AC_PROG_CXX - fi - if test "$enable_f90" != no ; then - PAC_PROG_FC - fi - # Set defaults for the TEST versions if not already set - if test -z "$TESTCC" ; then - TESTCC=${CC:=cc} - fi - if test -z "$TESTF77" ; then - TESTF77=${F77:=f77} - fi - if test -z "$TESTCXX" ; then - TESTCXX=${CXX:=CC} - fi - if test -z "$TESTFC" ; then - TESTFC=${FC:=f90} - fi # in $with_mpi/bin or $with_mpi if test "X$MPICC" = "X" ; then if test -x "$with_mpi/bin/mpicc" ; then @@ -413,9 +400,12 @@ case $ac_mpi_type in # Use the default choices for the compilers ;; esac +]) + +AC_DEFUN([PAC_MPI_FIND_COMPILERS],[ # Tell autoconf to determine properties of the compilers (these are the # compilers for MPI programs) -AC_PROG_CC +PAC_PROG_CC if test "$enable_f77" != no -a "$enable_fortran" != no ; then AC_PROG_F77 fi @@ -430,22 +420,23 @@ fi dnl dnl This uses the selected CC etc to check for include paths and libraries AC_DEFUN([PAC_MPI_CHECK_MPI_LIB],[ +AC_REQUIRE([AC_PROG_CC]) case $ac_mpi_type in - mpich) + mpich) ;; - mpichnt) + mpichnt) dnl dnl This isn't adequate, but it helps with using MPICH-NT/SDK.gcc - save_CFLAGS="$CFLAGS" - CFLAGS="$save_CFLAGS -I$with_mpichnt/include" - save_CPPFLAGS="$CPPFLAGS" - CPPFLAGS="$save_CPPFLAGS -I$with_mpichnt/include" - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$save_LDFLAGS -L$with_mpichnt/lib" + PAC_PUSH_FLAG([CFLAGS]) + CFLAGS="$CFLAGS -I$with_mpichnt/include" + PAC_PUSH_FLAG([CPPFLAGS]) + CPPFLAGS="$CPPFLAGS -I$with_mpichnt/include" + PAC_PUSH_FLAG([LDFLAGS]) + LDFLAGS="$LDFLAGS -L$with_mpichnt/lib" AC_CHECK_LIB(mpich,MPI_Init,found="yes",found="no") if test "$found" = "no" ; then - AC_CHECK_LIB(mpich2,MPI_Init,found="yes",found="no") + AC_CHECK_LIB(mpich,MPI_Init,found="yes",found="no") fi if test "$enable_cxx" != no ; then AC_PROG_CXX @@ -459,33 +450,33 @@ case $ac_mpi_type in if test -z "$TESTCXX" ; then TESTCXX=${CXX:=CC} ; fi if test -z "$TESTFC" ; then TESTFC=${FC:=f90} ; fi if test "$found" = "no" ; then - CFLAGS=$save_CFLAGS - CPPFLAGS=$save_CPPFLAGS - LDFLAGS=$save_LDFLAGS + PAC_POP_FLAG([CFLAGS]) + PAC_POP_FLAG([CPPFLAGS]) + PAC_POP_FLAG([LDFLAGS]) fi ;; - lammpi) + lammpi) ;; - ibmmpi) + ibmmpi) ;; - sgimpi) + sgimpi) AC_CHECK_LIB(mpi,MPI_Init) if test "$ac_cv_lib_mpi_MPI_Init" = "yes" ; then MPILIBNAME="mpi" fi ;; - generic) - AC_SEARCH_LIBS(MPI_Init,mpi mpich2 mpich) + generic) + AC_SEARCH_LIBS(MPI_Init,mpi mpich mpich) if test "$ac_cv_lib_mpi_MPI_Init" = "yes" ; then MPILIBNAME="mpi" fi ;; - *) + *) ;; esac ]) diff --git a/ompi/mca/io/romio/romio/confdb/aclocal_romio.m4 b/ompi/mca/io/romio/romio/confdb/aclocal_romio.m4 index 9cc31130d0..b0753a409f 100644 --- a/ompi/mca/io/romio/romio/confdb/aclocal_romio.m4 +++ b/ompi/mca/io/romio/romio/confdb/aclocal_romio.m4 @@ -9,7 +9,7 @@ dnl If the test fails, sets NOF77 to 1, HAVE_FORTRAN to 0. dnl dnl AC_DEFUN([PAC_GET_FORTNAMES],[ - rm -f confftest.f confftest.o + rm -f confftest.f confftest.$OBJEXT cat > confftest.f < /dev/null 2>&1 - if test ! -s confftest.o ; then + if test ! -s confftest.$OBJEXT ; then AC_MSG_WARN([Unable to test Fortran compiler. Compiling a test program failed to produce an object file]) NOF77=1 @@ -28,17 +28,17 @@ program failed to produce an object file]) allstrings="-a" if test $arch_CRAY ; then allstrings="" - elif strings - confftest.o < /dev/null >/dev/null 2>&1 ; then + elif strings - confftest.$OBJEXT < /dev/null >/dev/null 2>&1 ; then allstrings="-" - elif strings -a confftest.o < /dev/null >/dev/null 2>&1 ; then + elif strings -a confftest.$OBJEXT < /dev/null >/dev/null 2>&1 ; then allstrings="-a" fi - nameform1=`strings $allstrings confftest.o | grep mpir_init_fop_ | head -1` - nameform2=`strings $allstrings confftest.o | grep MPIR_INIT_FOP | head -1` - nameform3=`strings $allstrings confftest.o | grep mpir_init_fop | head -1` - nameform4=`strings $allstrings confftest.o | grep mpir_init_fop__ | head -1` - rm -f confftest.f confftest.o + nameform1=`strings $allstrings confftest.$OBJEXT | grep mpir_init_fop_ | head -1` + nameform2=`strings $allstrings confftest.$OBJEXT | grep MPIR_INIT_FOP | head -1` + nameform3=`strings $allstrings confftest.$OBJEXT | grep mpir_init_fop | head -1` + nameform4=`strings $allstrings confftest.$OBJEXT | grep mpir_init_fop__ | head -1` + rm -f confftest.f confftest.$OBJEXT if test -n "$nameform4" ; then echo "Fortran externals are lower case and have two trailing underscores" FORTRANNAMES="FORTRANDOUBLEUNDERSCORE" @@ -175,19 +175,19 @@ define(PAC_TEST_MPI,[ MPI_Finalize(); } EOF - rm -f conftest - cmd="$CC $USER_CFLAGS -I$MPI_INCLUDE_DIR -o conftest mpitest.c $MPI_LIB" + rm -f conftest$EXEEXT + cmd="$CC $USER_CFLAGS -I$MPI_INCLUDE_DIR -o conftest$EXEEXT mpitest.c $MPI_LIB" echo "$as_me:$LINENO: $cmd" >&5 $cmd >&5 2>&5 - if test ! -x conftest ; then + if test ! -x conftest$EXEEXT ; then echo "$as_me:$LINENO: failed program was:" >&5 sed 's/^/| /' mpitest.c >&5 - rm -f conftest mpitest.c + rm -f conftest$EXEEXT mpitest.c AC_MSG_ERROR([Unable to compile a simple MPI program. Use environment variables to provide the location of MPI libraries and include directories]) else - rm -f conftest mpitest.c + rm -f conftest$EXEEXT mpitest.c fi AC_MSG_RESULT(yes) ])dnl @@ -204,17 +204,17 @@ define(PAC_NEEDS_FINT,[ i = 0; } EOF - rm -f mpitest1.o + rm -f mpitest1.$OBJEXT $CC $USER_CFLAGS -I$MPI_INCLUDE_DIR -c mpitest1.c > /dev/null 2>&1 - if test ! -s mpitest1.o ; then + if test ! -s mpitest1.$OBJEXT ; then NEEDS_MPI_FINT="#define NEEDS_MPI_FINT" CFLAGS="$CFLAGS -DNEEDS_MPI_FINT" AC_MSG_RESULT(no) - rm -f mpitest1.o mpitest1.c + rm -f mpitest1.$OBJEXT mpitest1.c else NEEDS_MPI_FINT="" AC_MSG_RESULT(yes) - rm -f mpitest1.o mpitest1.c + rm -f mpitest1.$OBJEXT mpitest1.c fi ])dnl dnl @@ -231,15 +231,15 @@ define(PAC_MPI_LONG_LONG_INT,[ MPI_Finalize(); } EOF - rm -f conftest - $CC $USER_CFLAGS -I$MPI_INCLUDE_DIR -o conftest mpitest.c $MPI_LIB > /dev/null 2>&1 - if test -x conftest ; then + rm -f conftest$EXEEXT + $CC $USER_CFLAGS -I$MPI_INCLUDE_DIR -o conftest$EXEEXT mpitest.c $MPI_LIB > /dev/null 2>&1 + if test -x conftest$EXEEXT ; then AC_MSG_RESULT(yes) AC_DEFINE(HAVE_MPI_LONG_LONG_INT,,[Define if mpi has long long it]) else AC_MSG_RESULT(no) fi - rm -f conftest mpitest.c + rm -f conftest$EXEEXT mpitest.c ])dnl dnl dnl PAC_LONG_LONG_64: check if there is a 64-bit long long @@ -292,11 +292,11 @@ dnl because the program cannot be run. return 0; } EOF - rm -f conftest - $CC $USER_CFLAGS -o conftest ltest.c > /dev/null 2>&1 - if test -x conftest ; then + rm -f conftest$EXEEXT + $CC $USER_CFLAGS -o conftest$EXEEXT ltest.c > /dev/null 2>&1 + if test -x conftest$EXEEXT ; then echo "assuming size of long long is 8bytes; use '-longlongsize' to indicate otherwise" - rm -f conftest ltest.c + rm -f conftest$EXEEXT ltest.c echo "defining MPI_Offset as long long in C and integer*8 in Fortran" AC_DEFINE(HAVE_LONG_LONG_64,,[Define if long long is 64 bits]) DEFINE_MPI_OFFSET="typedef long long MPI_Offset;" @@ -329,9 +329,9 @@ define(PAC_MPI_INFO,[ MPI_Finalize(); } EOF - rm -f conftest - $CC $USER_CFLAGS -I$MPI_INCLUDE_DIR -o conftest mpitest.c $MPI_LIB > /dev/null 2>&1 - if test -x conftest ; then + rm -f conftest$EXEEXT + $CC $USER_CFLAGS -I$MPI_INCLUDE_DIR -o conftest$EXEEXT mpitest.c $MPI_LIB > /dev/null 2>&1 + if test -x conftest$EXEEXT ; then AC_MSG_RESULT(yes) AC_DEFINE(HAVE_MPI_INFO,1,[Define if MPI_Info available]) HAVE_MPI_INFO="#define HAVE_MPI_INFO" @@ -347,7 +347,7 @@ EOF MPI_FINFO3=" INTEGER MPI_INFO_NULL" MPI_FINFO4=" PARAMETER (MPI_INFO_NULL=0)" fi - rm -f conftest mpitest.c + rm -f conftest$EXEEXT mpitest.c ])dnl dnl dnl @@ -366,9 +366,9 @@ define(PAC_MPI_DARRAY_SUBARRAY,[ MPI_Finalize(); } EOF - rm -f conftest - $CC $USER_CFLAGS -I$MPI_INCLUDE_DIR -o conftest mpitest.c $MPI_LIB > /dev/null 2>&1 - if test -x conftest ; then + rm -f conftest$EXEEXT + $CC $USER_CFLAGS -I$MPI_INCLUDE_DIR -o conftest$EXEEXT mpitest.c $MPI_LIB > /dev/null 2>&1 + if test -x conftest$EXEEXT ; then AC_MSG_RESULT(yes) AC_DEFINE(HAVE_MPI_DARRAY_SUBARRAY,,[Define if MPI Darray available]) HAVE_MPI_DARRAY_SUBARRAY="#define HAVE_MPI_DARRAY_SUBARRAY" @@ -390,7 +390,7 @@ EOF MPI_FARRAY6=" PARAMETER (MPI_DISTRIBUTE_NONE=123)" MPI_FARRAY7=" PARAMETER (MPI_DISTRIBUTE_DFLT_DARG=-49767)" fi - rm -f conftest mpitest.c + rm -f conftest$EXEEXT mpitest.c ])dnl dnl dnl @@ -405,15 +405,15 @@ define(PAC_CHECK_MPI_SGI_INFO_NULL,[ i = MPI_INFO_NULL; } EOF - rm -f conftest - $CC $USER_CFLAGS -I$MPI_INCLUDE_DIR -o conftest mpitest.c $MPI_LIB > /dev/null 2>&1 - if test -x conftest ; then + rm -f conftest$EXEEXT + $CC $USER_CFLAGS -I$MPI_INCLUDE_DIR -o conftest$EXEEXT mpitest.c $MPI_LIB > /dev/null 2>&1 + if test -x conftest$EXEEXT ; then AC_MSG_RESULT(yes) cp adio/sgi/mpi3.1/*.h include else AC_MSG_RESULT(no) fi - rm -f conftest mpitest.c + rm -f conftest$EXEEXT mpitest.c ])dnl dnl dnl @@ -430,15 +430,15 @@ define(PAC_CHECK_MPIOF_H,[ stop end EOF - rm -f conftest - $F77 $FFLAGS -I$MPI_INCLUDE_DIR -o conftest mpitest.f $MPI_LIB > /dev/null 2>&1 - if test -x conftest ; then + rm -f conftest$EXEEXT + $F77 $FFLAGS -I$MPI_INCLUDE_DIR -o conftest$EXEEXT mpitest.f $MPI_LIB > /dev/null 2>&1 + if test -x conftest$EXEEXT ; then AC_MSG_RESULT(yes) MPIOF_H_INCLUDED=1 else AC_MSG_RESULT(no) fi - rm -f conftest mpitest.f + rm -f conftest$EXEEXT mpitest.f ])dnl dnl dnl @@ -456,15 +456,15 @@ define(PAC_HAVE_PREAD64,[ pread64(fd, &buf, i, off); } EOF - rm -f conftest - $CC $USER_CFLAGS -o conftest conftest.c > /dev/null 2>&1 - if test -x conftest ; then + rm -f conftest$EXEEXT + $CC $USER_CFLAGS -o conftest$EXEEXT conftest.c > /dev/null 2>&1 + if test -x conftest$EXEEXT ; then AC_MSG_RESULT(yes) AC_DEFINE(HAVE_PREAD64,,[Define if pread64 available]) else AC_MSG_RESULT(no) fi -rm -f conftest conftest.c +rm -f conftest$EXEEXT conftest.c ])dnl dnl dnl @@ -483,15 +483,15 @@ define(PAC_TEST_MPI_SGI_type_is_contig,[ MPI_Finalize(); } EOF - rm -f conftest - $CC $USER_CFLAGS -I$MPI_INCLUDE_DIR -o conftest mpitest.c $MPI_LIB > /dev/null 2>&1 - if test -x conftest ; then + rm -f conftest$EXEEXT + $CC $USER_CFLAGS -I$MPI_INCLUDE_DIR -o conftest$EXEEXT mpitest.c $MPI_LIB > /dev/null 2>&1 + if test -x conftest$EXEEXT ; then AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) AC_DEFINE(NO_MPI_SGI_type_is_contig,,[Define if no MPI type is contig]) fi - rm -f conftest mpitest.c + rm -f conftest$EXEEXT mpitest.c ])dnl dnl dnl @@ -510,15 +510,15 @@ define(PAC_TEST_MPI_COMBINERS,[ MPI_Finalize(); } EOF - rm -f conftest - $CC $USER_CFLAGS -I$MPI_INCLUDE_DIR -o conftest mpitest.c $MPI_LIB > /dev/null 2>&1 - if test -x conftest ; then + rm -f conftest$EXEEXT + $CC $USER_CFLAGS -I$MPI_INCLUDE_DIR -o conftest$EXEEXT mpitest.c $MPI_LIB > /dev/null 2>&1 + if test -x conftest$EXEEXT ; then AC_MSG_RESULT(yes) AC_DEFINE(HAVE_MPI_COMBINERS,,[Define if MPI combiners available]) else AC_MSG_RESULT(no) fi - rm -f conftest mpitest.c + rm -f conftest$EXEEXT mpitest.c ])dnl dnl dnl @@ -534,12 +534,14 @@ rm -f conftest* # Determine the extension for Fortran 90 files (not all compilers accept # .f and not all accept .f90) if test -z "$ac_f90ext" ; then - if test -z "$F90" ; then - AC_CHECK_PROGS(F90,f90 xlf90 pgf90 ifort epcf90 f95 fort xlf95 lf95 pathf90 g95 fc ifc efc) + if test -z "$FC" ; then + # This list should correspond to the list in aclocal_fc.m4 + AC_CHECK_PROGS(FC,ifort pgf90 pathf90 pathf95 xlf90 xlf95 f90 epcf90 \ + f95 fort lf95 gfortran g95 ifc efc) fi AC_MSG_CHECKING([for extension for Fortran 90 programs]) ac_f90ext="f90" - ac_f90compile='${F90-f90} -c $F90FLAGS conftest.$ac_f90ext 1>&AC_FD_CC' + ac_f90compile='${FC-f90} -c $FCFLAGS conftest.$ac_f90ext 1>&AC_FD_CC' cat > conftest.$ac_f90ext < conftest.$ac_f90ext stop end EOF -if test -z "$F90" ; then - F90=f90 +if test -z "$FC" ; then + FC=f90 fi KINDVAL="" -if $F90 -o conftest conftest.$ac_f90ext >/dev/null 2>&1 ; then - ./conftest >/dev/null 2>&1 +if $FC -o conftest$EXEEXT conftest.$ac_f90ext >/dev/null 2>&1 ; then + ./conftest$EXEEXT >/dev/null 2>&1 if test -s conftest.out ; then KINDVAL=`cat conftest.out` fi @@ -608,16 +610,16 @@ define(PAC_TEST_MPI_HAVE_OFFSET_KIND,[ stop end EOF - rm -f conftest - $F77 $FFLAGS -I$MPI_INCLUDE_DIR -o conftest mpitest.f $MPI_LIB > /dev/null 2>&1 - if test -x conftest ; then + rm -f conftest$EXEEXT + $F77 $FFLAGS -I$MPI_INCLUDE_DIR -o conftest$EXEEXT mpitest.f $MPI_LIB > /dev/null 2>&1 + if test -x conftest$EXEEXT ; then AC_MSG_RESULT(yes) MPI_OFFSET_KIND1="!" MPI_OFFSET_KIND2="!" else AC_MSG_RESULT(no) fi - rm -f conftest mpitest.f + rm -f conftest$EXEEXT mpitest.f ])dnl dnl dnl @@ -654,56 +656,6 @@ fi ])dnl dnl -dnl -dnl Look for a style of VPATH. Known forms are -dnl VPATH = .:dir -dnl .PATH: . dir -dnl -dnl Defines VPATH or .PATH with . $(srcdir) -dnl Requires that vpath work with implicit targets -dnl NEED TO DO: Check that $< works on explicit targets. -dnl -define(PAC_MAKE_VPATH,[ -AC_SUBST(VPATH) -AC_MSG_CHECKING(for virtual path format) -# This is needed for Mac OSX 10.5 -rm -rf conftest.dSYM -rm -rf conftest* -mkdir conftestdir -cat >conftestdir/a.c < conftest <&1 | grep 'conftestdir/a.c'` -if test -n "$ac_out" ; then - AC_MSG_RESULT(VPATH) - VPATH='VPATH=.:$(srcdir)' -else - rm -f conftest - cat > conftest <&1 | grep 'conftestdir/a.c'` - if test -n "$ac_out" ; then - AC_MSG_RESULT(.PATH) - VPATH='.PATH: . $(srcdir)' - else - AC_MSG_RESULT(neither VPATH nor .PATH works) - fi -fi -# This is needed for Mac OSX 10.5 -rm -rf conftest.dSYM -rm -rf conftest* -])dnl -dnl define(PAC_HAVE_MOUNT_NFS,[ AC_MSG_CHECKING([if MOUNT_NFS is defined in the include files]) rm -f conftest.c @@ -715,9 +667,9 @@ define(PAC_HAVE_MOUNT_NFS,[ int i=MOUNT_NFS; } EOF - rm -f conftest - $CC $USER_CFLAGS -o conftest conftest.c > /dev/null 2>&1 - if test -x conftest ; then + rm -f conftest$EXEEXT + $CC $USER_CFLAGS -o conftest$EXEEXT conftest.c > /dev/null 2>&1 + if test -x conftest$EXEEXT ; then AC_MSG_RESULT(yes) ROMIO_HAVE_MOUNT_NFS=1 AC_DEFINE(HAVE_MOUNT_NFS,,[Define if MOUNT_NFS defined]) @@ -725,7 +677,7 @@ EOF ROMIO_HAVE_MOUNT_NFS=0 AC_MSG_RESULT(no) fi - rm -f conftest conftest.c + rm -f conftest$EXEEXT conftest.c ])dnl dnl dnl @@ -735,7 +687,7 @@ dnl tries to determine the Fortran 90 kind parameter for 4-byte integers dnl define(PAC_MPI_OFFSET_KIND_4BYTE, [AC_MSG_CHECKING([for Fortran 90 KIND parameter for 4-byte integers]) -rm -f kind.f kind.o kind +rm -f kind.f kind.$OBJEXT kind$EXEEXT cat < kind.f program main integer i @@ -746,17 +698,17 @@ cat < kind.f stop end EOF -if test -z "$F90" ; then - F90=f90 +if test -z "$FC" ; then + FC=f90 fi KINDVAL="" -if $F90 -o kind kind.f >/dev/null 2>&1 ; then +if $FC -o kind$EXEEXT kind.f >/dev/null 2>&1 ; then ./kind >/dev/null 2>&1 if test -s k.out ; then KINDVAL=`cat k.out` fi fi -rm -f kind k.out kind.f kind.o +rm -f kind$EXEEXT k.out kind.f kind.$OBJEXT if test -n "$KINDVAL" -a "$KINDVAL" != "-1" ; then AC_MSG_RESULT($KINDVAL) MPI_OFFSET_KIND1=" INTEGER MPI_OFFSET_KIND" @@ -777,9 +729,9 @@ define(PAC_FUNC_STRERROR,[ char *s = strerror(5); } EOF - rm -f conftest - $CC $USER_CFLAGS -o conftest conftest.c >> config.log 2>&1 - if test -x conftest ; then + rm -f conftest$EXEEXT + $CC $USER_CFLAGS -o conftest$EXEXT conftest.c >> config.log 2>&1 + if test -x conftest$EXEEXT ; then AC_MSG_RESULT(yes) AC_DEFINE(HAVE_STRERROR,,[Define if strerror available]) else @@ -796,16 +748,16 @@ changequote(,) } EOF changequote([,]) - rm -f conftest - $CC $USER_CFLAGS -o conftest conftest.c > config.log 2>&1 - if test -x conftest ; then + rm -f conftest$EXEEXT + $CC $USER_CFLAGS -o conftest$EXEEXT conftest.c > config.log 2>&1 + if test -x conftest$EXEEXT ; then AC_MSG_RESULT(yes) AC_DEFINE(HAVE_SYSERRLIST,,[Define if syserrlist available]) else AC_MSG_RESULT(no) fi fi - rm -f conftest conftest.c + rm -f conftest$EXEEXT conftest.c ])dnl dnl define(PAC_TEST_MPIR_STATUS_SET_BYTES,[ @@ -824,18 +776,18 @@ define(PAC_TEST_MPIR_STATUS_SET_BYTES,[ MPI_Finalize(); } EOF - rm -f conftest - $CC $USER_CFLAGS -I$MPI_INCLUDE_DIR -o conftest mpitest.c $MPI_LIB > /dev/null 2>&1 - if test -x conftest ; then + rm -f conftest$EXEEXT + $CC $USER_CFLAGS -I$MPI_INCLUDE_DIR -o conftest$EXEEXT mpitest.c $MPI_LIB > /dev/null 2>&1 + if test -x conftest$EXEEXT ; then AC_MSG_RESULT(yes) AC_DEFINE(HAVE_STATUS_SET_BYTES,,[Define if status set bytes available]) else AC_MSG_RESULT(no) fi - rm -f conftest mpitest.c + rm -f conftest$EXEEXT mpitest.c ])dnl define(PAC_TEST_MPIU_FUNCS,[ - AC_MSG_CHECKING(support for MPICH2 memory macros) + AC_MSG_CHECKING(support for MPICH memory macros) rm -f mpitest.c cat > mpitest.c < /dev/null 2>&1 - if test -x conftest ; then + rm -f conftest$EXEEXT + $CC $USER_CFLAGS -I$MPI_INCLUDE_DIR -o conftest$EXEEXT mpitest.c $MPI_LIB > /dev/null 2>&1 + if test -x conftest$EXEEXT ; then AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_MPIU_FUNCS,1,[Define if MPICH2 memory tracing macros defined]) + AC_DEFINE(HAVE_MPIU_FUNCS,1,[Define if MPICH memory tracing macros defined]) else AC_MSG_RESULT(no) fi - rm -f conftest mpitest.c + rm -f conftest$EXEEXT mpitest.c ])dnl dnl define(PAC_TEST_MPI_GREQUEST,[ @@ -870,14 +822,14 @@ define(PAC_TEST_MPI_GREQUEST,[ MPI_Finalize(); } EOF - rm -f conftest - $CC $USER_CFLAGS -I$MPI_INCLUDE_DIR -o conftest mpitest.c $MPI_LIB > /dev/null 2>&1 - if test -x conftest ; then + rm -f conftest$EXEEXT + $CC $USER_CFLAGS -I$MPI_INCLUDE_DIR -o conftest$EXEEXT mpitest.c $MPI_LIB > /dev/null 2>&1 + if test -x conftest$EXEEXT ; then AC_MSG_RESULT(yes) AC_DEFINE(HAVE_MPI_GREQUEST,1,[Define if generalized requests avaliable]) DEFINE_HAVE_MPI_GREQUEST="#define HAVE_MPI_GREQUEST 1" else AC_MSG_RESULT(no) fi - rm -f conftest mpitest.c + rm -f conftest$EXEEXT mpitest.c ])dnl diff --git a/ompi/mca/io/romio/romio/confdb/aclocal_runlog.m4 b/ompi/mca/io/romio/romio/confdb/aclocal_runlog.m4 index 66533a2e4a..83576c50c6 100644 --- a/ompi/mca/io/romio/romio/confdb/aclocal_runlog.m4 +++ b/ompi/mca/io/romio/romio/confdb/aclocal_runlog.m4 @@ -62,3 +62,191 @@ PAC_COMMAND_IFELSE([$1 > $pac_TESTLOG],[ ]) rm -f $pac_TESTLOG ]) +dnl +dnl +dnl +dnl PAS_VAR_COPY - A portable layer that mimics AS_VAR_COPY when it is not +dnl defined as in older autoconf, e.g. 2.63 and older. +dnl This macro is absolutely necessary, because AS_VAR_GET in +dnl some newer autoconf, e.g. 2.64, seems to be totally broken, +dnl or behave very different from older autoconf, i.e. 2.63. +dnl +AC_DEFUN([PAS_VAR_COPY],[ +m4_ifdef([AS_VAR_COPY], [AS_VAR_COPY([$1],[$2])], [$1=AS_VAR_GET([$2])]) +]) +dnl +dnl +dnl +dnl PAC_VAR_PUSHVAL(VARNAME, [LastSavedValue])) +dnl +dnl Save the content of the shell variable, VARNAME, onto a stack. +dnl The saved value of VARNAME is restorable with respect to the nesting +dnl of the macro. +dnl +dnl The Last saved value of VARNAME on the stack is stored in shell variable +dnl pac_LastSavedValueOf_$VARNAME if the 2nd argument is NOT supplied. +dnl If the 2nd argument is present, the last saved value will be stored +dnl in the 2nd argument instead. +dnl +dnl The First saved value of VARNAME on the stack is stored in shell variable +dnl dnl pac_FirstSavedValueOf_$VARNAME. +dnl +AC_DEFUN([PAC_VAR_PUSHVAL],[ +# START of PUSHVAL +dnl define local m4-name pac_stk_level. +AS_VAR_PUSHDEF([pac_stk_level], [pac_stk_$1_level]) +AS_VAR_SET_IF([pac_stk_level],[ + dnl autoconf < 2.64 does not have AS_VAR_ARITH, so use expr instead. + AS_VAR_SET([pac_stk_level], [`expr $pac_stk_level + 1`]) +],[ + AS_VAR_SET([pac_stk_level], [0]) +]) +dnl AS_ECHO_N(["PUSHVAL: pac_stk_level = $pac_stk_level, "]) +dnl Save the content of VARNAME, i.e. $VARNAME, onto the stack. +AS_VAR_SET([pac_stk_$1_$pac_stk_level],[$$1]) +AS_VAR_IF([pac_stk_level], [0], [ + dnl Save the 1st pushed value of VARNAME as pac_FirstSavedValueOf_$VARNAME + PAS_VAR_COPY([pac_FirstSavedValueOf_$1],[pac_stk_$1_$pac_stk_level]) +]) +ifelse([$2],[],[ + dnl Save the last pushed value of VARNAME as pac_LastSavedValueOf_$VARNAME + PAS_VAR_COPY([pac_LastSavedValueOf_$1],[pac_stk_$1_$pac_stk_level]) + dnl AS_ECHO(["pac_LastSavedValueOf_$1 = $pac_LastSavedValueOf_$1"]) +],[ + dnl Save the last pushed value of VARNAME as $2 + PAS_VAR_COPY([$2],[pac_stk_$1_$pac_stk_level]) + dnl AS_ECHO(["$2 = $$2"]) +]) +AS_VAR_POPDEF([pac_stk_level]) +# END of PUSHVAL +]) +dnl +dnl +dnl +dnl PAC_VAR_POPVAL(VARNAME) +dnl +dnl Restore variable, VARNAME, from the stack. +dnl This macro is safe with respect to the nesting. +dnl Some minimal checking of nesting balance of PAC_VAR_PUSH[POP]VAL() +dnl is done here. +dnl +AC_DEFUN([PAC_VAR_POPVAL],[ +# START of POPVAL +dnl define local m4-name pac_stk_level. +AS_VAR_PUSHDEF([pac_stk_level], [pac_stk_$1_level]) +AS_VAR_SET_IF([pac_stk_level],[ + AS_VAR_IF([pac_stk_level],[-1],[ + AC_MSG_WARN(["Imbalance of PUSHVAL/POPVAL of $1"]) + ],[ + dnl AS_ECHO_N(["POPVAL: pac_stk_level = $pac_stk_level, "]) + PAS_VAR_COPY([$1],[pac_stk_$1_$pac_stk_level]) + dnl AS_ECHO(["popped_val = $$1"]) + dnl autoconf < 2.64 does not have AS_VAR_ARITH, so use expr instead. + AS_VAR_SET([pac_stk_level], [`expr $pac_stk_level - 1`]) + ]) +],[ + AC_MSG_WARN(["Uninitialized PUSHVAL/POPVAL of $1"]) +]) +AS_VAR_POPDEF([pac_stk_level]) +# END of POPVAL +]) +dnl +dnl +dnl +dnl PAC_COMPILE_IFELSE_LOG is a wrapper around AC_COMPILE_IFELSE with the +dnl output of ac_compile to a specified logfile instead of AS_MESSAGE_LOG_FD +dnl +dnl PAC_COMPILE_IFELSE_LOG(logfilename, input, +dnl [action-if-true], [action-if-false]) +dnl +dnl where input, [action-if-true] and [action-if-false] are used +dnl in AC_COMPILE_IFELSE(input, [action-if-true], [action-if-false]). +dnl This macro is nesting safe. +dnl +AC_DEFUN([PAC_COMPILE_IFELSE_LOG],[ +dnl +dnl Instead of defining our own ac_compile and do AC_TRY_EVAL +dnl on these variables. We modify ac_compile used by AC_*_IFELSE +dnl by piping the output of the command to a logfile. The reason is that +dnl 1) AC_TRY_EVAL is discouraged by Autoconf. 2) defining our ac_compile +dnl could mess up the usage and order of *CFLAGS, LDFLAGS and LIBS in +dnl these commands, i.e. deviate from how GNU standard uses these variables. +dnl +dnl Replace ">&AS_MESSAGE_LOG_FD" by "> FILE 2>&1" in ac_compile. +dnl Save a copy of ac_compile on a stack +dnl which is safe through nested invocations of this macro. +PAC_VAR_PUSHVAL([ac_compile]) +dnl Modify ac_compile based on the unmodified ac_compile. +ac_compile="`echo $pac_FirstSavedValueOf_ac_compile | sed -e 's|>.*$|> $1 2>\&1|g'`" +AC_COMPILE_IFELSE([$2],[ + ifelse([$3],[],[:],[$3]) +],[ + ifelse([$4],[],[:],[$4]) +]) +dnl Restore the original ac_compile from the stack. +PAC_VAR_POPVAL([ac_compile]) +]) +dnl +dnl +dnl +dnl PAC_LINK_IFELSE_LOG is a wrapper around AC_LINK_IFELSE with the +dnl output of ac_link to a specified logfile instead of AS_MESSAGE_LOG_FD +dnl +dnl PAC_LINK_IFELSE_LOG(logfilename, input, +dnl [action-if-true], [action-if-false]) +dnl +dnl where input, [action-if-true] and [action-if-false] are used +dnl in AC_LINK_IFELSE(input, [action-if-true], [action-if-false]). +dnl This macro is nesting safe. +dnl +AC_DEFUN([PAC_LINK_IFELSE_LOG],[ +dnl +dnl Instead of defining our own ac_link and do AC_TRY_EVAL +dnl on these variables. We modify ac_link used by AC_*_IFELSE +dnl by piping the output of the command to a logfile. The reason is that +dnl 1) AC_TRY_EVAL is discouraged by Autoconf. 2) defining our ac_link +dnl could mess up the usage and order of *CFLAGS, LDFLAGS and LIBS in +dnl these commands, i.e. deviate from how GNU standard uses these variables. +dnl +dnl Replace ">&AS_MESSAGE_LOG_FD" by "> FILE 2>&1" in ac_link. +dnl Save a copy of ac_link on a stack +dnl which is safe through nested invocations of this macro. +PAC_VAR_PUSHVAL([ac_link]) +dnl Modify ac_link based on the unmodified ac_link. +ac_link="`echo $pac_FirstSavedValueOf_ac_link | sed -e 's|>.*$|> $1 2>\&1|g'`" +dnl +AC_LINK_IFELSE([$2],[ + ifelse([$3],[],[:],[$3]) +],[ + ifelse([$4],[],[:],[$4]) +]) +dnl Restore the original ac_link from the stack. +PAC_VAR_POPVAL([ac_link]) +]) +dnl +dnl +dnl +dnl PAC_COMPLINK_IFELSE (input1, input2, [action-if-true], [action-if-false]) +dnl +dnl where input1 and input2 are either AC_LANG_SOURCE or AC_LANG_PROGRAM +dnl enclosed input programs. +dnl +dnl The macro first compiles input1 and uses the object file created +dnl as part of LIBS during linking. This macro is nesting safe. +dnl +AC_DEFUN([PAC_COMPLINK_IFELSE],[ +AC_COMPILE_IFELSE([$1],[ + PAC_RUNLOG([mv conftest.$OBJEXT pac_conftest.$OBJEXT]) + PAC_VAR_PUSHVAL([LIBS]) + LIBS="pac_conftest.$OBJEXT $pac_FirstSavedValueOf_LIBS" + AC_LINK_IFELSE([$2],[ + ifelse([$3],[],[:],[$3]) + ],[ + ifelse([$4],[],[:],[$4]) + ]) + PAC_VAR_POPVAL([LIBS]) + rm -f pac_conftest.$OBJEXT +],[ + ifelse([$4],[],[:],[$4]) +]) +]) diff --git a/ompi/mca/io/romio/romio/confdb/aclocal_shl.m4 b/ompi/mca/io/romio/romio/confdb/aclocal_shl.m4 index c9c40d852e..b4c71d7a6e 100644 --- a/ompi/mca/io/romio/romio/confdb/aclocal_shl.m4 +++ b/ompi/mca/io/romio/romio/confdb/aclocal_shl.m4 @@ -113,7 +113,7 @@ case "$enable_sharedlibs" in C_LINK_SHL='${CC} -dynamiclib -undefined suppress -single_module -flat_namespace' CC_SHL='${CC} -fPIC' # No way in osx to specify the location of the shared libraries at link - # time (see the code in createshlib in mpich2/src/util) + # time (see the code in createshlib in mpich/src/util) # As of 10.5, -Wl,-rpath,dirname should work . The dirname # must be a single directory, not a colon-separated list (use multiple # -Wl,-rpath,path for each of the paths in the list). However, os x @@ -380,7 +380,7 @@ AC_DEFUN([PAC_CC_SUBDIR_SHLIBS],[ fi # Libtool needs master_top_builddir if test "X$master_top_builddir" = "X" ; then - AC_MSG_ERROR([Libtool requires master_top_builddir - check configure.in sources]) + AC_MSG_ERROR([Libtool requires master_top_builddir - check configure.ac sources]) fi AC_SUBST(master_top_builddir) fi @@ -405,3 +405,104 @@ if test "$SHLIB_EXT" = "unknown" ; then esac fi ]) + +dnl PAC_COMPILER_SHLIB_FLAGS(compiler-var,output-file) +dnl +dnl Uses confdb/config.rpath to determine important linking flags and +dnl information. This is mainly intended to support the compiler wrapper +dnl scripts in MPICH ("mpicc" and friends) which cannot directly use libtool to +dnl handle linking. MPICH's compiler wrappers attempt to link executables with +dnl an rpath by default. The resulting variable assignment statements will be +dnl placed into "output-file", which is then suitable for AC_SUBST_FILE or +dnl sourcing in a shell script (including configure itself). +dnl +dnl This macro assumes that the basic tests associated with "compiler-var" have +dnl been run already, but does not AC_REQUIRE them in order to prevent problems +dnl with "expanded before required" when requiring the AC_PROG_{CC,F77,FC,CXX} +dnl macros. +dnl +dnl Example usage: +dnl +dnl ----8<---- +dnl # compute flags for linking executables against shared libraries when using +dnl # the modern Fortran compiler ($FC). +dnl PAC_COMPILER_SHLIB_FLAGS([FC],[src/env/fc_shlib.conf]) +dnl ----8<---- +AC_DEFUN([PAC_COMPILER_SHLIB_FLAGS],[ +AC_REQUIRE_AUX_FILE([config.rpath]) +AC_REQUIRE([AC_CANONICAL_HOST]) + +# It appears that the libtool dynamic linking strategy on Darwin is this: +# 1. Link all shared libs with "-install_name /full/path/to/libfoo.dylib" +# 2. Don't do anything special when linking programs, since it seems that the +# darwin dynamic linker will always use the "install_name" field from the lib +# that was found at program link-time. (CONFIRMED) This is in opposition to +# the way that Linux does it, where specifying a "-rpath" argument at program +# link-time is important. +# +# There is an alternative darwin strategy for versions +# >= 10.5, see this: http://www.cmake.org/pipermail/cmake/2010-August/038970.html +# (goodell@ 2011-06-17) + +AC_MSG_CHECKING([for shared library (esp. rpath) characteristics of $1]) + +# unfortunately, config.rpath expects the compiler in question is always CC and +# uses several other environment variables as input +PAC_PUSH_FLAG([CC]) +PAC_PUSH_FLAG([GCC]) +PAC_PUSH_FLAG([LD]) +# these two don't currently get overridden, but we push/pop them for safety in +# case they do in the future +PAC_PUSH_FLAG([LDFLAGS]) +PAC_PUSH_FLAG([with_gnu_ld]) + +# set the temporary override values (if any) +m4_case([$1], +[CC], + [:], dnl do nothing special for CC, values are already correct +[F77], + [CC="$$1" + GCC="$G77" + LD="$LD_F77"], +[FC], + [CC="$$1" + GCC="$GCC_FC" + LD="$LD_FC"], +[CXX], + [CC="$$1" + GCC="$GXX" + LD="$LD_CXX"], +[m4_fatal([unknown compiler argument "$1"])]) + +# ensure the values are available to the script +export CC +export GCC +export LDFLAGS +export LD +export with_gnu_ld + +# FIXME these variables refer to each other and prefixing breaks that, so we +# will disable the prefixing for now +## force all variables set in $2 to be prefixed with the compiler name instead of "acl_cv_" +#PAC_CC_PREFIX=$1_ +PAC_CC_PREFIX= +export PAC_CC_PREFIX + +AS_IF([$ac_aux_dir/config.rpath "$host" > $2],[:],[AC_MSG_ERROR([unable to execute $ac_aux_dir/config.rpath])]) + +C_LINKPATH_SHL="" +AC_SUBST([C_LINKPATH_SHL]) + +AS_UNSET([PAC_CC_PREFIX]) +rm -f conftest.out + +# restore the old values +PAC_POP_FLAG([with_gnu_ld]) +PAC_POP_FLAG([LD]) +PAC_POP_FLAG([LDFLAGS]) +PAC_POP_FLAG([GCC]) +PAC_POP_FLAG([CC]) + +AC_MSG_RESULT([done (results in $2)]) +]) + diff --git a/ompi/mca/io/romio/romio/confdb/aclocal_subcfg.m4 b/ompi/mca/io/romio/romio/confdb/aclocal_subcfg.m4 index 9f8851ed92..301aa1705d 100644 --- a/ompi/mca/io/romio/romio/confdb/aclocal_subcfg.m4 +++ b/ompi/mca/io/romio/romio/confdb/aclocal_subcfg.m4 @@ -1,6 +1,6 @@ dnl PAC_RESET_ALL_FLAGS - Reset precious flags to those set by the user AC_DEFUN([PAC_RESET_ALL_FLAGS],[ - if test "$FROM_MPICH2" = "yes" ; then + if test "$FROM_MPICH" = "yes" ; then CFLAGS="$USER_CFLAGS" CPPFLAGS="$USER_CPPFLAGS" CXXFLAGS="$USER_CXXFLAGS" @@ -13,7 +13,7 @@ AC_DEFUN([PAC_RESET_ALL_FLAGS],[ dnl PAC_RESET_LINK_FLAGS - Reset precious link flags to those set by the user AC_DEFUN([PAC_RESET_LINK_FLAGS],[ - if test "$FROM_MPICH2" = "yes" ; then + if test "$FROM_MPICH" = "yes" ; then LDFLAGS="$USER_LDFLAGS" LIBS="$USER_LIBS" fi @@ -25,7 +25,7 @@ dnl dnl The subconfigure argument list is created based on "ac_precious_vars" dnl instead of explicitly use of well-known Makefile variables, like dnl CC/CFLAGS/CPPFLAGS..., this generalization is effective as long as -dnl calling configure.in declares the needed variables to be passed down +dnl calling configure.ac declares the needed variables to be passed down dnl to subconfigure as "precious" appropriately. The precious variable dnl can be created in the following ways: dnl 1) implicit declaration through use of autoconf macros, like @@ -34,99 +34,182 @@ dnl AC_PROG_F77 (declares F77/FFLAGS/FLIBS) ... dnl which are in turns invoked by other subconfigure. dnl When in doubt, check "ac_precious_var" in the calling configure. dnl 2) explicit "precious" declaration through AC_ARG_VAR. -dnl Without correct "precious" declaration in the calling configure.in, +dnl Without correct "precious" declaration in the calling configure.ac, dnl there would be variables not being included in the subconfigure dnl argument list. dnl dnl Note: I suspect this DEFUN body is underquoted in places, but it does not dnl seem to cause problems in practice yet. [goodell@ 2010-05-18] AC_DEFUN([PAC_CONFIG_SUBDIR_ARGS],[ + pac_dir="$1" AC_MSG_NOTICE([===== configuring $1 =====]) - PAC_MKDIRS($1) pac_abs_srcdir=`(cd $srcdir && pwd)` if test -f $pac_abs_srcdir/$1/setup ; then + AC_MSG_NOTICE([sourcing $pac_abs_srcdir/$1/setup]) . $pac_abs_srcdir/$1/setup fi - pac_subconfigure_file="$pac_abs_srcdir/$1/configure" - if test -x $pac_subconfigure_file ; then - pac_subconfig_args="$2" + # Adapted for MPICH from the autoconf-2.67 implementation of + # AC_CONFIG_SUBDIRS. Search for "MPICH note:" for relevant commentary and + # local modifications. - # Set IFS so ac_configure_args can be tokenized - # with extra " " tokens being skipped. - saved_IFS="$IFS" - IFS="'" - for pac_arg in $ac_configure_args ; do - case "$pac_arg" in - # Ignore any null and leading blank strings. - ""|" "*) - ;; - *) - pac_pval="" - # Restore saved IFS so ac_precious_vars which has - # " " as separator can be correctly tokenized - IFS="$saved_IFS" - for pac_pvar in $ac_precious_vars ; do - # check if configure argument token contains the - # precious variable, i.e. "name_of_prec_var=". - pvar_in_arg=`echo $pac_arg | grep "$pac_pvar="` - if test "X$pvar_in_arg" != "X" ; then - # check if current precious variable is set in env - eval pvar_set=\${$pac_pvar+set} - if test "$pvar_set" = "set" ; then - # Append 'name_of_prec_var=value_of_prec_var' - # to the subconfigure arguments list, where - # value_of_prec_var is fetched from the env. - eval pac_pval=\${$pac_pvar} - pac_subconfig_args="$pac_subconfig_args '$pac_pvar=$pac_pval'" - break - fi - fi - done - # since the precious variable is not set in the env., - # append the corresponding configure argument token - # to the subconfigure argument list. - if test "X$pac_pval" = "X" ; then - pac_subconfig_args="$pac_subconfig_args '$pac_arg'" + # Remove --cache-file, --srcdir, and --disable-option-checking arguments + # so they do not pile up. Otherwise relative paths (like --srcdir=.. from + # make distcheck) will be incorrect. + pac_sub_configure_args="$2" + pac_prev= + eval "set x $ac_configure_args" + shift + for pac_arg + do + if test -n "$pac_prev"; then + pac_prev= + continue + fi + case $pac_arg in + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + pac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \ + | --c=*) + ;; + --config-cache | -C) + ;; + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + pac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + ;; + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + pac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + ;; + --disable-option-checking) + ;; + *) + # MPICH note: this is a more robust version of the "precious + # variable" propagation code that was present in the previous + # incarnation of this macro + for pac_pvar in $ac_precious_vars ; do + # check if configure argument token contains the + # precious variable, i.e. "name_of_prec_var=". + if ( echo $pac_arg | grep "^$pac_pvar=" >/dev/null 2>&1 ) ; then + # check if current precious variable is set in env + eval pvar_set=\${$pac_pvar+set} + if test "$pvar_set" = "set" ; then + # Append 'name_of_prec_var=value_of_prec_var' + # to the subconfigure arguments list, where + # value_of_prec_var is fetched from the env. + # this also overrides any value set on the command line + eval pac_pval=\${$pac_pvar} + pac_arg="$pac_pvar=$pac_pval" + break fi - # reset "'" as IFS to process ac_configure_args - saved_IFS="$IFS" - IFS="'" - ;; - esac + fi done - # Restore IFS. - IFS="$saved_IFS" - dnl echo "pac_subconfig_args = |$pac_subconfig_args|" + case $pac_arg in + *\'*) pac_arg=`AS_ECHO(["$pac_arg"]) | sed "s/'/'\\\\\\\\''/g"` ;; + esac + AS_VAR_APPEND([pac_sub_configure_args], [" '$pac_arg'"]) ;; + esac + done - dnl Add option to disable configure options checking - if test "$enable_option_checking" = no ; then - pac_subconfig_args="$pac_subconfig_args --disable-option-checking" - fi + # Always prepend --prefix to ensure using the same prefix + # in subdir configurations. + # MPICH note: see tt#983 for an example of why this is necessary + pac_arg="--prefix=$prefix" + case $pac_arg in + *\'*) pac_arg=`AS_ECHO(["$pac_arg"]) | sed "s/'/'\\\\\\\\''/g"` ;; + esac + pac_sub_configure_args="'$pac_arg' $pac_sub_configure_args" - AC_MSG_NOTICE([executing: $pac_subconfigure_file $pac_subconfig_args]) - if (cd $1 && eval $pac_subconfigure_file $pac_subconfig_args) ; then - ifelse([$3],[],[:],[$3]) - else - ifelse([$4],[],[:],[$4]) - fi + # Pass --silent + if test "$silent" = yes; then + pac_sub_configure_args="--silent $pac_sub_configure_args" + fi + + # Always prepend --disable-option-checking to silence warnings, since + # different subdirs can have different --enable and --with options. + pac_sub_configure_args="--disable-option-checking $pac_sub_configure_args" + + pac_popdir=`pwd` + + # Do not complain, so a configure script can configure whichever + # parts of a large source tree are present. + test -d "$srcdir/$pac_dir" || continue + + # MPICH note: modified to remove the internal "_AS_*" macro usage, also + # msg is already printed at top +dnl _AS_ECHO_LOG([$pac_msg]) +dnl _AS_ECHO([$pac_msg]) + AS_MKDIR_P(["$pac_dir"]) + # MPICH note: we leave this internal macro reference for now. We can clone + # the macro locally if this turns out to be non-portable across several autoconf + # versions. It sets the following variables: ac_builddir, + # ac_top_builddir_sub, ac_top_build_prefix, ac_srcdir, ac_top_srcdir, + # ac_abs_top_builddir, ac_abs_builddir, ac_abs_top_srcdir, ac_abs_srcdir + _AC_SRCDIRS(["$pac_dir"]) + + cd "$pac_dir" + + # Check for guested configure; otherwise get Cygnus style configure. + if test -f "$ac_srcdir/configure.gnu"; then + pac_sub_configure=$ac_srcdir/configure.gnu + elif test -f "$ac_srcdir/configure"; then + pac_sub_configure=$ac_srcdir/configure + elif test -f "$ac_srcdir/configure.ac"; then + # This should be Cygnus configure. + pac_sub_configure=$ac_aux_dir/configure else - if test -e $pac_subconfigure_file ; then - AC_MSG_WARN([$pac_subconfigure_file exists but is not executable]) - else - AC_MSG_WARN([$pac_subconfigure_file does not exist]) - fi - fi + AC_MSG_WARN([no configuration information is in $pac_dir]) + pac_sub_configure= + fi + + # The recursion is here. + if test -n "$pac_sub_configure"; then + # MPICH note: overriding the cache file on purpose to prevent strange + # issues resulting from inter-dir caching +dnl # Make the cache file name correct relative to the subdirectory. +dnl case $cache_file in +dnl [[\\/]]* | ?:[[\\/]]* ) pac_sub_cache_file=$cache_file ;; +dnl *) # Relative name. +dnl pac_sub_cache_file=$ac_top_build_prefix$cache_file ;; +dnl esac + pac_sub_cache_file="/dev/null" + + AC_MSG_NOTICE([running $SHELL $pac_sub_configure $pac_sub_configure_args --cache-file=$pac_sub_cache_file --srcdir=$ac_srcdir]) + # The eval makes quoting arguments work. + # MPICH note: we want to execute the provided actions, not be silent + # or error out if the subconfigure succeeded/failed +dnl eval "\$SHELL \"\$pac_sub_configure\" $pac_sub_configure_args \ +dnl --cache-file=\"\$pac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" || +dnl AC_MSG_ERROR([$pac_sub_configure failed for $pac_dir]) + if eval "\$SHELL \"\$pac_sub_configure\" $pac_sub_configure_args \ + --cache-file=\"\$pac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" + then + # restore the current dir for the provided actions + cd "$pac_popdir" + $3 + else + # restore the current dir for the provided actions + cd "$pac_popdir" + $4 + fi + fi + + cd "$pac_popdir" AC_MSG_NOTICE([===== done with $1 configure =====]) # Check for any localdefs files. These may be created, so we # look in the local directory first. if test -f $1/localdefs ; then + AC_MSG_NOTICE([sourcing $1/localdefs]) . $1/localdefs elif test -f $pac_abs_srcdir/$1/localdefs ; then + AC_MSG_NOTICE([sourcing $pac_abs_srcdir/$1/localdefs]) . $pac_abs_srcdir/$1/localdefs fi ]) @@ -135,3 +218,44 @@ dnl Sandbox configure dnl Usage: PAC_CONFIG_SUBDIR(subdir,action-if-success,action-if-failure) AC_DEFUN([PAC_CONFIG_SUBDIR],[PAC_CONFIG_SUBDIR_ARGS([$1],[],[$2],[$3])]) +dnl PAC_SUBCFG_EXPAND_SUFFIX_MACRO(MACRO_PREFIX,MACRO_PATH_SUFFIX) +dnl converts the path given by MACRO_PATH_SUFFIX (with '/' chars in it) to one +dnl with '_' chars in it and then appends that to MACRO_PREFIX with '_' in +dnl between. The resulting macro name is then expanded, but with informative +dnl "##" comments before and after the expansion. +dnl +dnl This is intended to be an internal helper macro for the PAC_SUBCFG +dnl implementation. +dnl +dnl XXX DJG FIXME: need to be able to deal with PREREQ macros that potentially +dnl aren't present while having safety for BODY macros when there are +dnl misspellings +AC_DEFUN([PAC_SUBCFG_EXPAND_PATH_SUFFIX_MACRO],[ +dnl convert path separators into '_', the m4_translit is intentionally unquoted +m4_pushdef([subsys_uscore_name],[$1_]m4_translit([$2],[\/],[__]))dnl +m4_ifdef(m4_defn([subsys_uscore_name]),[],[m4_fatal([macro ]m4_defn([subsys_uscore_name])[ is undefined])])dnl +[##] begin expansion of m4_defn([subsys_uscore_name]) +dnl call the computed routine name with the remaining args +m4_indir(m4_defn([subsys_uscore_name]),m4_shift($@)) +dnl there is intentionally no "dnl" on the previous line to reduce the chance of +dnl a "fi## end expansion" bug when the BODY macro doesn't end in a newline +[##] end expansion of m4_defn([subsys_uscore_name]) +]) + +dnl invokes the PAC_SUBCFG_BODY_foo macro for the "foo" subsys, when "foo" is +dnl passed as the only argument to this macro. The first arg may be the '/' +dnl path version instead of having underscores. +AC_DEFUN([PAC_SUBCFG_CONFIGURE_SUBSYS],[PAC_SUBCFG_EXPAND_PATH_SUFFIX_MACRO([PAC_SUBCFG_BODY],[$1])]) + +dnl invokes the PAC_SUBCFG_PREREQ_foo macro for the "foo" subsys, when "foo" is +dnl passed as the only argument to this macro. The first arg may be the '/' +dnl path version instead of having underscores. +AC_DEFUN([PAC_SUBCFG_DO_PREREQ],[PAC_SUBCFG_EXPAND_PATH_SUFFIX_MACRO([PAC_SUBCFG_PREREQ],[$1])]) + +dnl takes no arguments, expands to "foo_bar_baz" when invoked in a file named +dnl "foo/bar/baz/subconfigure.m4" +dnl +dnl This is useful for reducing copy-paste errors when defining PREREQ and BODY +dnl macros. If you tinker with this macro, watch the quoting carefully. +AC_DEFUN([PAC_SUBCFG_AUTO_SUFFIX],[m4_translit(m4_bpatsubst(m4_dquote(__file__),[/[^/]+.m4],[]),[/],[_])]) + diff --git a/ompi/mca/io/romio/romio/confdb/aclocal_util.m4 b/ompi/mca/io/romio/romio/confdb/aclocal_util.m4 index 3eecb22772..a0b0e148fe 100644 --- a/ompi/mca/io/romio/romio/confdb/aclocal_util.m4 +++ b/ompi/mca/io/romio/romio/confdb/aclocal_util.m4 @@ -92,7 +92,7 @@ dnl Create any missing directories in the path AC_DEFUN([PAC_MKDIRS],[ # Build any intermediate directories for dir in $1 ; do - saveIFS="$IFS" + PAC_PUSH_FLAG([IFS]) IFS="/" tmp_curdir="" for tmp_subdir in $dir ; do @@ -100,7 +100,7 @@ for dir in $1 ; do if test ! -d "$tmp_curdir" ; then mkdir "$tmp_curdir" ; fi tmp_curdir="${tmp_curdir}/" done - IFS="$saveIFS" + PAC_POP_FLAG([IFS]) done ]) @@ -189,3 +189,13 @@ fi rm -rf conftest.dSYM rm -f conftest* ]) + +dnl PAC_CONF_HEX_TO_DEC(value,out_var) +dnl +dnl Converts the given hexadecimal integer constant to an integer constant and +dnl stores the result in the shell variable given by 'out_var'. +dnl +dnl I think that printf like this will be sufficiently portable, but I don't +dnl have any guarantee of it. If not, we can fall back to AS_VAR_ARITH +dnl and/or AC_COMPUTE_INT (the latter will probably be slow) +AC_DEFUN([PAC_CONV_HEX_TO_DEC],[AS_VAR_SET([$2],[`printf "%d" $1`])]) diff --git a/ompi/mca/io/romio/romio/confdb/ax_tls.m4 b/ompi/mca/io/romio/romio/confdb/ax_tls.m4 index f7fc68840b..2704438226 100644 --- a/ompi/mca/io/romio/romio/confdb/ax_tls.m4 +++ b/ompi/mca/io/romio/romio/confdb/ax_tls.m4 @@ -51,7 +51,7 @@ AC_DEFUN([AX_TLS], [ case $ax_tls_keyword in none) ac_cv_tls=none ; break ;; *) - # MPICH2 modification: This was an AC_TRY_COMPILE before, but + # MPICH modification: This was an AC_TRY_COMPILE before, but # Darwin with non-standard compilers will accept __thread at # compile time but fail to link due to an undefined # "__emutls_get_address" symbol unless -lgcc_eh is added to the @@ -65,7 +65,7 @@ AC_DEFUN([AX_TLS], [ ]) if test "$ac_cv_tls" != "none"; then - # MPICH2 modification: this was "TLS" before instead of + # MPICH modification: this was "TLS" before instead of # "MPIU_TLS_SPECIFIER", but TLS had a reasonably high chance of conflicting # with a system library. AC_DEFINE_UNQUOTED([MPIU_TLS_SPECIFIER], $ac_cv_tls, [If the compiler supports a TLS storage class define it to that here]) diff --git a/ompi/mca/io/romio/romio/configure.ac b/ompi/mca/io/romio/romio/configure.ac index d23c30ed53..36f897c48a 100644 --- a/ompi/mca/io/romio/romio/configure.ac +++ b/ompi/mca/io/romio/romio/configure.ac @@ -1,11 +1,12 @@ # -*- Mode: shell-script -*- # build with -# autoconf --localdir=../confdb configure.in +# autoconf --localdir=../confdb configure.ac # (or wherever the confdb is) # # irrelevant / unnecessary in an Open MPI environment, but are # harmless and are left here solely for the sake of ease of future # patching/importing. +AC_PREREQ([2.63]) # Open MPI: Modifications to this file were done on an "let's do the # minimum possible" basis, not so that we can skip on the work or @@ -15,13 +16,33 @@ # irrelevant / unnecessary in an Open MPI environment, but are # harmless and are left here solely for the sake of ease of future # patching/importing. +AC_INIT([ROMIO], + [Open MPI], + [discuss@mpich.org], + [romio], + [http://www.mpich.org/]) +dnl AC_CONFIG_AUX_DIR(../../../confdb) +dnl Set the directory that contains the required install-sh, config.sub, +dnl and config.guess . Make sure that these are updated (in MPICH, use +dnl the top-level confdb files). This separate directory is used for +dnl the moment to allow ROMIO to be separatedly distributed. +dnl scripts. +AC_CONFIG_AUX_DIR([confdb]) +AC_CONFIG_MACRO_DIR([confdb]) -AC_PREREQ(2.59) +AM_INIT_AUTOMAKE([-Wall -Werror -Wno-portability-recursive foreign 1.12 silent-rules subdir-objects]) +AM_MAINTAINER_MODE([enable]) + +dnl must come before LT_INIT, which AC_REQUIREs AC_PROG_CC +PAC_PROG_CC + +AM_PROG_AR + +LT_INIT([]) +# Non-verbose make by default +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) -# if this blows up, it's because you forgot to run autoheader -# Open MPI: changed to 4 arg AC INIT -AC_INIT([romio], [Open MPI 1.2.6], [http://www.mpich.org], [romio]) # VERSION=1.2.6 # AC_MSG_RESULT([Configuring ROMIO Version $VERSION]) CONFIGURE_ARGS="$*" @@ -29,16 +50,24 @@ if test -n "$CONFIGURE_ARGS" ; then echo "Configuring with args $CONFIGURE_ARGS" fi -if test "$FROM_MPICH2" = "yes" ; then - CFLAGS="$MPICH2_INTERNAL_CFLAGS" - CXXFLAGS="$MPICH2_INTERNAL_CXXFLAGS" - FFLAGS="$MPICH2_INTERNAL_FFLAGS" - F90FLAGS="$MPICH2_INTERNAL_F90FLAGS" -fi - AC_CONFIG_HEADER(adio/include/romioconf.h) -# Open MPI: added AH_TOP -AH_TOP([#include "romioconf-undefs.h"]) +# Open MPI: modified AH_TOP +AH_TOP([/* + * (C) 2011 by Argonne National Laboratory. + * See COPYRIGHT in top-level directory. + */ +#ifndef ROMIOCONF_H_INCLUDED +#define ROMIOCONF_H_INCLUDED + +#include "romioconf-undefs.h" +]) +AH_BOTTOM([ +/* quash PACKAGE and PACKAGE_* vars, see MPICH top-level configure.ac for + * more info */ +#include "nopackage.h" + +#endif /* !defined(ROMIOCONF_H_INCLUDED) */ +]) # Open MPI: this configure script doesn't seem to define these # anywhere, so just do them manually here because "we know better" @@ -72,9 +101,18 @@ NOF77=1 NOF90=1 ARCH="" arch_IRIX="" -MPI="" +MPI_IMPL="" MPI_INCLUDE_DIR="" ROMIO_INCLUDE="" + +# Used by the new build system, should contain zero or more "-Iblah" args for +# inclusion in AM_CPPFLAGS. Should not contain relative paths. This probably +# overlaps with ROMIO_INCLUDE some, but adding a new var is easier than teasing +# apart all of the current usages of that variable and re-testing all of the +# non-MPICH and exotic platform cases. +MPI_H_INCLUDE="" +AC_SUBST([MPI_H_INCLUDE]) + TEST_LIBNAME="" FILE_SYSTEM="" # Do not set variables to empty that may be communicated from the @@ -82,14 +120,18 @@ FILE_SYSTEM="" DEBUG=no MIPS=0 BITS=0 + +AC_ARG_VAR([FROM_MPICH],[set to "yes" if building ROMIO inside of MPICH]) FROM_MPICH=${FROM_MPICH:-no} -FROM_MPICH2=${FROM_MPICH2:-no} -if test "$FROM_MPICH" = yes -a "$FROM_MPICH2" = yes ; then - AC_MSG_WARN([Both FROM_MPICH and FROM_MPICH set to yes; at most one should be yes]) - -fi + +AC_ARG_VAR([FROM_LAM],[set to "yes" if building ROMIO inside of LAM]) FROM_LAM=${FROM_LAM:-no} if test "$FROM_LAM" = 1 ; then FROM_LAM=yes ; fi + +AC_ARG_VAR([FROM_OMPI],[set to "yes" if building ROMIO inside of Open MPI]) +FROM_OMPI=${FROM_OMPI:-no} +if test "$FROM_OMPI" = 1 ; then FROM_OMPI=yes ; fi + CFLAGS=${CFLAGS:-""} LL="lld" AR_LOCAL="" @@ -144,10 +186,25 @@ MPIO_REQ_TMP_POBJECTS="iotest.p iowait.p iowaitall.p iowaitany.p iotestall.p iot MPIO_REQ_REAL_POBJECTS="_iotest.o _iowait.o _iowaitall.o _iowaitany.o _iotestall.o _iotestany.o _iowaitsome.o _iotestsome.o" # have_aio=no -# -known_filesystems="nfs ufs pfs pvfs pvfs2 testfs xfs panfs gridftp lustre bgl bglockless zoidfs" # Open MPI: added "open_mpi_mpi" -known_mpi_impls="mpich2_mpi mpich_mpi sgi_mpi hp_mpi cray_mpi lam_mpi open_mpi_mpi" +known_mpi_impls="mpich_mpi mpich_mpi sgi_mpi hp_mpi cray_mpi lam_mpi open_mpi_mpi" + +dnl An m4 macro for use with m4_foreach_w and friends. You should modify this +dnl list if you want to add a known file system. The list is just whitespace +dnl separated, so you can use newlines and tabs as well. +m4_define([known_filesystems_m4_w], + [nfs ufs pfs pvfs pvfs2 testfs xfs panfs gridftp lustre bg bgl bglockless zoidfs hfs piofs sfs])dnl +dnl +dnl An m4 macro for use with m4_foreach and friends. Expands to a quoted list of +dnl quoted elements. A bit easier to use without unintended expansion than the +dnl whitespace version. +m4_define([known_filesystems_m4], m4_dquote(m4_map_args_w(m4_defn([known_filesystems_m4_w]),[],[],[,])))dnl +dnl +# a shell var for checking arguments given via --with-file-system=... +known_filesystems="m4_join([ ],known_filesystems_m4)" + +##################################################################### + # # Defaults AC_ARG_ENABLE(aio,[ @@ -173,8 +230,11 @@ AC_ARG_WITH(file-system,[ --with-file-system=name - Build with support for the named file systems],,) AC_ARG_WITH(pvfs2,[ --with-pvfs2=path - Path to installation of PVFS (version 2)],,) -AC_ARG_WITH(mpi,[ ---with-mpi=name - Specify MPI implementation to build ROMIO for],,) +AC_ARG_WITH(mpi-impl,[ +--with-mpi-impl=name - Specify MPI implementation to build ROMIO for],,) +dnl +AC_ARG_WITH(mpi, [ +--with-mpi=path - Path to instalation of MPI (headers, libs, etc)],,) dnl if test "$enable_f77" != "yes" ; then NOF77=1 @@ -194,25 +254,12 @@ MPI=$with_mpi # CC=$MPI/bin/mpicc #fi +# start with the set of file systems that the user asked for FILE_SYSTEM=$with_file_system -# -dnl AC_CONFIG_AUX_DIR(../../../confdb) -dnl Set the directory that contains the required install-sh, config.sub, -dnl and config.guess . Make sure that these are updated (in MPICH2, use -dnl the top-level confdb files). This separate directory is used for -dnl the moment to allow ROMIO to be separatedly distributed. -dnl scripts. -AC_CONFIG_AUX_DIR(confdb) + # Check if Make is working PAC_PROG_MAKE - -# Open MPI: Init automake -AM_INIT_AUTOMAKE([foreign]) - -# Open MPI: If Automake supports silent rules, enable them. -m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) - # # Check that an arch was set # If it wasn't set, try to guess using "util/tarch" @@ -222,10 +269,10 @@ if test -s $srcdir/util/tarch -a ! -x $srcdir/util/tarch ; then chmod a+x $srcdir/util/tarch fi if test -z "$ARCH" -a -x $srcdir/util/tarch ; then - AC_MSG_CHECKING(for architecture) + AC_MSG_CHECKING([for architecture]) ARCH=`$srcdir/util/tarch | sed s/-/_/g` if test -z "$ARCH" ; then - AC_MSG_RESULT(Unknown!) + AC_MSG_RESULT([Unknown!]) AC_MSG_ERROR([Error: Could not guess target architecture, you must set an architecture type with the environment variable ARCH]) fi @@ -238,7 +285,7 @@ fi #### WE SHOULD REMOVE THIS SOON grep __"$ARCH"_ $srcdir/.config_params > /dev/null 2>&1 if test $? != 0 ; then - AC_MSG_WARN([Unknown architecture $arch... proceeding anyway]) + AC_MSG_WARN([Unknown architecture $ARCH... proceeding anyway]) fi # # @@ -274,55 +321,32 @@ AC_SUBST(top_build_dir) # Most of these are done for us; add the documentation directories # # mandir is the root for the man pages -#if test -z "$mandir" ; then mandir='${prefix}/man' ; fi -#AC_SUBST(mandir) -#if test -z "$docdir" ; then docdir='${prefix}/doc' ; fi -#AC_SUBST(docdir) -#if test -z "$htmldir" ; then htmldir='${prefix}/www' ; fi -#AC_SUBST(htmldir) -# -# check for valid file system -if test -n "$FILE_SYSTEM" ; then - # if multiple filesystems are passed in, they are '+'-delimited - # we could set the IFS to tokenize FILE_SYSTEM, but the FILE_SYSTEM env var - # is used in multiple places in the build system: get rid of the '+'s so we - # can use the 'for x in $FILE_SYSTEM ...' idiom - FILE_SYSTEM=`echo $FILE_SYSTEM|sed -e 's/\+/ /g'` - for x in $FILE_SYSTEM - do - found=no - # We could also do test -d "ad_$y" to test for known file systems - # based on having access to the adio code. Then adding a file - # system would not require changing configure to change known_filesystems - for y in $known_filesystems ; do - if test $x = $y ; then - found=yes - eval "file_system_`echo $x`=1" - break - fi - done - if test "$found" = "no" ; then - AC_MSG_WARN([Unknown file system $x... proceeding anyway]) - fi - done -fi -# +if test -z "$mandir" ; then mandir='${prefix}/man' ; fi +AC_SUBST(mandir) +if test -z "$docdir" ; then docdir='${prefix}/doc' ; fi +AC_SUBST(docdir) +if test -z "$htmldir" ; then htmldir='${prefix}/www' ; fi +AC_SUBST(htmldir) + + # If we are building within a known MPI implementation, we must avoid the # tests about an existing implementation -if test "$FROM_MPICH" != no -o "$FROM_MPICH2" != no -o "$FROM_LAM" != no ; then +if test "$FROM_MPICH" != no -o "$FROM_LAM" != no -o "$FROM_OMPI" != no ; then WITHIN_KNOWN_MPI_IMPL=yes else WITHIN_KNOWN_MPI_IMPL=no fi -# Open MPI: Make it think we're a known MPI implementation -WITHIN_KNOWN_MPI_IMPL=yes +# Open MPI: Set the MPI implementation +if test "$FROM_OMPI" = "yes" ; then + MPI_IMPL=open_mpi +fi # check for valid MPI implementation -if test -n "$MPI" ; then +if test -n "$MPI_IMPL" ; then found=no for mpi in $known_mpi_impls ; do - if test "${MPI}_mpi" = "$mpi" ; then + if test "${MPI_IMPL}_mpi" = "$mpi" ; then found=yes break fi @@ -332,6 +356,12 @@ if test -n "$MPI" ; then fi fi # + +if test -n "${with_mpi}" ; then + MPI_INCLUDE_DIR="${with_mpi}"/include + MPI_LIB_DIR="${with_mpi}"/lib +fi + # check for valid MPI include directory if specified if test $WITHIN_KNOWN_MPI_IMPL = no ; then if test -n "$MPI_INCLUDE_DIR"; then @@ -356,17 +386,7 @@ if test $WITHIN_KNOWN_MPI_IMPL = no ; then fi fi fi -# -# -# Open MPI - bad for Automake -#AR="${AR:-ar} cr$AR_LOCAL" -# Open MPI - don't test for ranlib - use AC_PROG_RANLIB all the time -#if test -z "$RANLIB" ; then - AC_PROG_RANLIB -#fi -# Open MPI - don't set make -# MAKE=${MAKE:-make} -# + # USER_CFLAGS and USER_FFLAGS are used only in test/Makefile.in if test $DEBUG = "yes"; then USER_CFLAGS="$CFLAGS -g" @@ -381,13 +401,13 @@ fi # We must first select the C and Fortran compilers. Because of the # way that the PROG_CC autoconf macro works (and all of the macros that # require it, including CHECK_HEADERS), that macro must occur exactly -# once in the configure.in file, at least as of autoconf 2.57 . +# once in the configure.ac file, at least as of autoconf 2.57 . # Unfortunately, this requirement is not enforced. To handle this, # we first case on the architecture; then use PROG_CC, then case on the # architecture again for any arch-specific features. We also set the # C_DEBUG_FLAG and F77_DEBUG_FLAG in case debugging is selected. # -# For the MPICH and MPICH2 configures, the compilers will already be +# For the MPICH and MPICH configures, the compilers will already be # selected, so most of the compiler-selection code will be bypassed. # -------------------------------------------------------------------------- # For historical reasons @@ -397,16 +417,6 @@ fi # C_DEBUG_FLAG="-g" F77_DEBUG_FLAG="-g" -# C_OPT_FLAG=${CFLAGS:-"-O"} -# MPICH1 uses OPTFLAGS and OPTFLAGSC to specify separate optimization -# flags for the C compiler (this is better that adding it to the -# undifferentiated CFLAGS, at least on input). -if test -n "$OPTFLAGS" ; then - C_OPT_FLAG="$C_OPT_FLAG $OPTFLAGS" -fi -if test -n "$OPTFLAGSC" ; then - C_OPT_FLAG="$C_OPT_FLAG $OPTFLAGSC" -fi # Open MPI: ignore all setting of CC, f77, FC, etc. in this section case $ARCH in solaris|solaris86) @@ -484,14 +494,20 @@ case $ARCH in ;; esac -PAC_PROG_CC - -if test "$NOF77" != 1 ; then - # Grrr. The autoconf test for F77 will abort the configure - # if no compiler is found. We'd prefer to simply turn off - # support for Fortran, and/or give a more informative message. - PAC_PROG_F77 +dnl AC_PROG_{CXX,F77,FC} must come early in configure.ac in order to control +dnl compiler search order and avoid some esoteric autoconf macro expansion +dnl errors +if test "$enable_f77" = "yes" ; then + # suppress default "-g -O2" from AC_PROG_F77 + : ${FFLAGS=""} + AC_PROG_F77([PAC_F77_SEARCH_LIST]) fi +if test "$enable_f90" = "yes" ; then + # suppress default "-g -O2" from AC_PROG_FC + : ${FCFLAGS=""} + AC_PROG_FC([PAC_FC_SEARCH_LIST]) +fi + if test "$CC" = "gcc" -a -z "$C_DEBUG_FLAG" ; then C_DEBUG_FLAG="-g -O -Wall -Wstrict-prototypes -Wmissing-prototypes" fi @@ -505,25 +521,23 @@ fi # Here go the rest of the tests # --------------------------------------------------------------------------- if test -n "$arch_solaris" || test -n "$arch_solaris86" ; then - if test -z "$MPI" ; then - MPI=mpich + if test -z "$MPI_IMPL" ; then + MPI_IMPL=mpich mpi_mpich=1 fi - if test $MPI = "mpich" ; then + if test $MPI_IMPL = "mpich" ; then TEST_CC=mpicc TEST_F77=mpif77 else TEST_CC="$CC" TEST_F77="$F77" fi - #OMPI: Bad for automake: AR="ar cr" -# solaris does not have l option to ar fi if test -n "$arch_rs6000"; then - if test -z "$MPI" ; then - MPI=mpich + if test -z "$MPI_IMPL" ; then + MPI_IMPL=mpich mpi_mpich=1 fi AC_DEFINE(AIX,1,[Define for AIX]) @@ -535,21 +549,6 @@ if test -n "$arch_rs6000"; then fi # -if test -n "$arch_tflop" || test -n "$arch_tflops"; then - # TFLOP_FLAGS="-cougar -D__PUMA" - #OMPI: Bad for automake: AR="xar cr$AR_LOCAL" - #OMPI: Bad for automake: RANLIB="xranlib" - MPI_LIB="$MPI_LIB" - if test -z "$MPI" ; then - MPI=mpich - mpi_mpich=1 - fi - if test -z "$FILE_SYSTEM" ; then - file_system_ufs=1 - FILE_SYSTEM="ufs" - fi -fi -# if test -n "$arch_freebsd" || test -n "$arch_LINUX" || test -n "$arch_LINUX_ALPHA" || test -n "$arch_netbsd" || test -n "$arch_openbsd" ; then if test -n "$arch_freebsd" || test -n "$arch_netbsd" || test -n "$arch_openbsd"; then ac_cv_sizeof_long_long=${ac_cv_sizeof_long_long:-0} @@ -557,8 +556,8 @@ if test -n "$arch_freebsd" || test -n "$arch_LINUX" || test -n "$arch_LINUX_ALPH fi # Find the CPP before the header check AC_PROG_CPP - if test -z "$MPI" ; then - MPI=mpich + if test -z "$MPI_IMPL" ; then + MPI_IMPL=mpich mpi_mpich=1 fi fi @@ -566,13 +565,12 @@ fi if test -n "$arch_SX4" ; then have_aio=no AC_DEFINE(SX4,1,[Define for NEC SX4]) - if test -z "$MPI" ; then - MPI=mpich + if test -z "$MPI_IMPL" ; then + MPI_IMPL=mpich mpi_mpich=1 fi + # supply a reasonable default fs if test -z "$FILE_SYSTEM" ; then - file_system_sfs=1 - file_system_nfs=1 FILE_SYSTEM="sfs nfs" fi MPI_OFFSET_KIND1=" INTEGER MPI_OFFSET_KIND" @@ -583,34 +581,34 @@ fi if test -n "$arch_hpux" || test -n "$arch_sppux" ; then have_aio=no #OMPI: Bad for automake: RANLIB=":" - if test -z "$MPI"; then + if test -z "$MPI_IMPL"; then if test -f "/opt/mpi/include/mpi.h" ; then echo "assuming that you want to use ROMIO with HP MPI" - MPI=hp + MPI_IMPL=hp else echo "assuming that you want to use ROMIO with MPICH" - MPI=mpich + MPI_IMPL=mpich fi fi - if test $MPI = "mpich" ; then + if test $MPI_IMPL = "mpich" ; then mpi_mpich=1 MPI_LIB="$MPI_LIB -lV3" CC=${CC:-cc -Ae} F77=${FC:-f77 +U77} fi - if test $MPI = "hp" ; then + if test $MPI_IMPL = "hp" ; then mpi_hp=1 CC=${CC:-mpicc -Ae} F77=${FC:-mpif77 +U77} fi - if test $MPI = "lam" && test "$FC" != ""; then + if test $MPI_IMPL = "lam" && test "$FC" != ""; then F77="$F77 +U77" fi FTESTDEFINE="external iargc, getarg" if test -n "$arch_hpux" ; then CFLAGS="$CFLAGS -D_LARGEFILE64_SOURCE" AC_DEFINE(HPUX,1,[Define for HPUX]) - if test $MPI = "hp" ; then + if test $MPI_IMPL = "hp" ; then F77=${FC:-mpif90 +U77} else F77=${FC:-f90 +U77} @@ -631,8 +629,8 @@ if test -n "$arch_hpux" || test -n "$arch_sppux" ; then fi # if test -n "$arch_alpha" || test -n "$arch_ALPHA" ; then - if test -z "$MPI" ; then - MPI=mpich + if test -z "$MPI_IMPL" ; then + MPI_IMPL=mpich mpi_mpich=1 fi @@ -647,10 +645,10 @@ if test -n "$arch_CRAY" ; then FTESTDEFINE="integer ilen" F77GETARG="call pxfgetarg(i, str, ilen, ierr)" have_aio=no - # OMPI: bad for automake: RANLIB=":" + #OMPI: Bad for automake: RANLIB=":" AC_DEFINE(CRAY,1,[Define if Cray]) - if test -z "$MPI" || test -n "$mpi_sgi" ; then - MPI=cray + if test -z "$MPI_IMPL" || test -n "$mpi_sgi" ; then + MPI_IMPL=cray mpi_cray=1 mpi_sgi="" # above is to disable configure tests specific to SGI MPI @@ -697,7 +695,7 @@ fi # if test -n "$arch_IRIX"; then if test $osversion = 4 ; then - # OMPI: Bad for automake:RANLIB="ar ts" + #OMPI: Bad for automake:RANLIB="ar ts" if test -n "$mpi_sgi"; then AC_MSG_ERROR([SGI\'s MPI does not work with IRIX 4.x]) fi @@ -706,25 +704,20 @@ if test -n "$arch_IRIX"; then AC_MSG_ERROR([SGI\'s MPI does not work with IRIX 5.x]) fi elif test $osversion = 6 ; then - if test -z "$MPI"; then - if test "$FROM_MPICH2" = "yes" ; then - # Building with MPICH2. Distinguish from MPICH-1 - MPI=mpich2 - mpi_mpich2=1 + if test -z "$MPI_IMPL"; then + if test "$FROM_MPICH" = "yes" ; then + MPI_IMPL=mpich + mpi_mpich=1 elif test -f "/usr/include/mpi.h" ; then # removed use of escaped single quotes in messages # because they confuse Emacs, making it hard to # read the files (with emacs :) ) AC_MSG_WARN([assuming that you want to use ROMIO with the SGI MPI]) - MPI=sgi + MPI_IMPL=sgi mpi_sgi=1 - else - AC_MSG_WARN([assuming that you want to use ROMIO with MPICH]) - MPI=mpich - mpi_mpich=1 fi fi - #OMPI: Bad for automake: RANLIB=":" + #OMPI: Bad for automake: RANLIB=":" AC_DEFINE(AIO_SIGNOTIFY_NONE,1,[Define if no signotify]) if test $cputype -ge 5000 ; then MIPS=4 @@ -737,19 +730,18 @@ if test -n "$arch_IRIX"; then fi # check if pread64 is defined PAC_HAVE_PREAD64 -# + + # supply a reasonable default fs if test -z "$FILE_SYSTEM" ; then - file_system_nfs=1 FILE_SYSTEM="nfs" AC_MSG_CHECKING(for xfs) AC_TRY_COMPILE([ #include ], -[aiocb64_t *t1;],file_system_xfs=1;FILE_SYSTEM="xfs $FILE_SYSTEM";) - if test "$file_system_xfs" = 1 ; then +[aiocb64_t *t1;],xfs_works=1;FILE_SYSTEM="xfs $FILE_SYSTEM";) + if test "$xfs_works" = 1 ; then AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) - file_system_ufs=1 FILE_SYSTEM="ufs $FILE_SYSTEM" fi fi @@ -762,8 +754,8 @@ fi AC_HAVE_FUNCS(memalign) # -# Question: Should ROMIO under MPICH2 ignore the Fortran tests, since -# MPICH2 provides all of the Fortran interface routines? +# Question: Should ROMIO under MPICH ignore the Fortran tests, since +# MPICH provides all of the Fortran interface routines? # if test $NOF77 = 0 ; then echo "checking Fortran external names" @@ -792,7 +784,7 @@ AC_CHECK_HEADERS([unistd.h fcntl.h malloc.h stddef.h sys/types.h]) # # When compiling ROMIO on Darwin with _POSIX_C_SOURCE defined (such as when -# using --enable-strict in MPICH2), sys/types.h does not define u_short and +# using --enable-strict in MPICH), sys/types.h does not define u_short and # friends unless _DARWIN_C_SOURCE is also defined (see compat(5) on a Darwin # box). This would normally be fine, except sys/stat.h defines struct stat to # use u_long, so strict compiles fail. One option is to also compile with @@ -901,7 +893,7 @@ if test "$NOF77" = 0 ; then $FORTRAN_MPI_OFFSET j end EOF - if $F77 -o conftest conftest.f >>config.log 2>&1 && test -x conftest ; then + if $F77 -o conftest$EXEEXT conftest.f >>config.log 2>&1 && test -x conftest$EXEEXT ; then ac_cv_f77_offset_type_works=yes fi rm -f conftest* @@ -916,7 +908,7 @@ EOF integer (kind=$MPI_OFFSET_KIND_VAL) j end EOF - if $F77 -o conftest conftest.f >>config.log 2>&1 && test -x conftest ; then + if $F77 -o conftest$EXEEXT conftest.f >>config.log 2>&1 && test -x conftest$EXEEXT ; then ac_cv_f77_allows_offset_kind=yes fi rm -f conftest* @@ -956,10 +948,10 @@ fi if test $WITHIN_KNOWN_MPI_IMPL = no ; then PAC_MPI_DARRAY_SUBARRAY fi -if test $FROM_MPICH2 = yes ; then +if test $FROM_MPICH = yes ; then dnl Made this a message instead of a warning because the warning is dnl likely to confuse users. - AC_MSG_RESULT([Overriding Array test for MPICH2]) + AC_MSG_RESULT([Overriding Array test for MPICH]) unset BUILD_MPI_ARRAY AC_DEFINE(HAVE_MPI_DARRAY_SUBARRAY,1,[Define if Darray is available]) HAVE_MPI_DARRAY_SUBARRAY="#define HAVE_MPI_DARRAY_SUBARRAY" @@ -1012,7 +1004,7 @@ extern int PFoo(int); int main(int argc, char **argv) { return PFoo(0);} EOF - ac_link2='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest1.c conftest2.c $LIBS >conftest.out 2>&1' + ac_link2='${CC-cc} -o conftest$EXEEXT $CFLAGS $CPPFLAGS $LDFLAGS conftest1.c conftest2.c $LIBS >conftest.out 2>&1' if eval $ac_link2 ; then AC_MSG_RESULT(yes) AC_MSG_CHECKING([that the compiler correctly implements weak symbols]) @@ -1090,7 +1082,26 @@ if test "$HAVE_WEAK_SYMBOLS" = 1 ; then fi AC_SUBST(HAVE_WEAK_SYMBOLS) +# FIXME we only build ROMIO in embedded mode for now +AM_CONDITIONAL([BUILD_ROMIO_EMBEDDED],[true]) +# FIXME need to get this right for non-MPICH builds +AM_CONDITIONAL([BUILD_MPIO_REQUEST],[false]) +# FIXME need to get this right for non-MPICH builds +AM_CONDITIONAL([BUILD_MPIO_ERRHAN],[false]) +# if we don't have weak symbol support, we must build a separate convenience +# library in order to provide the "PMPI_" symbols +# Open MPI: Disable the profile library +#AM_CONDITIONAL([BUILD_PROFILING_LIB],[test "x$HAVE_WEAK_SYMBOLS" = "x0"]) +AM_CONDITIONAL([BUILD_PROFILING_LIB],[false]) + +# weird: we have conflated "buid ROMIO's versions of the fortran bindings" and +# "build ROMIO"s fortran I/O tests". Of course the common situaiton is that we +# are building as part of MPICH, which builds its own fortran bindings, but we +# still want tests built +AM_CONDITIONAL([BUILD_F77_BINDINGS],[test "x$NOF77" != "x1" && test "x$FROM_MPICH" != "xyes"]) + +AM_CONDITIONAL([BUILD_F77_TESTS],[test "x$NOF77" != "x1"]) # # Check whether the MPI Offset type is compatible with struct flock @@ -1124,15 +1135,44 @@ fi # if FILE_SYSTEM is not set above, use ufs and nfs as default # if test -z "$FILE_SYSTEM" ; then - file_system_ufs=1 - file_system_nfs=1 FILE_SYSTEM="ufs nfs" fi # no matter what, always build testfs -file_system_testfs=1 FILE_SYSTEM="testfs $FILE_SYSTEM" +# check for valid file system +if test -n "$FILE_SYSTEM" ; then + # if multiple filesystems are passed in, they are '+'-delimited + # we could set the IFS to tokenize FILE_SYSTEM, but the FILE_SYSTEM env var + # is used in multiple places in the build system: get rid of the '+'s so we + # can use the 'for x in $FILE_SYSTEM ...' idiom + FILE_SYSTEM=`echo $FILE_SYSTEM|sed -e 's/\+/ /g'` + for x in $FILE_SYSTEM + do + found=no + # We could also do test -d "ad_$y" to test for known file systems + # based on having access to the adio code. Then adding a file + # system would not require changing configure to change known_filesystems + for y in $known_filesystems ; do + if test $x = $y ; then + found=yes + eval "file_system_`echo $x`=1" + break + fi + done + if test "$found" = "no" ; then + AC_MSG_WARN([Unknown file system $x... proceeding anyway]) + fi + done +fi + +############################################# +# This PVFS2 logic is special because it's hard to get it right if it comes +# before the known_filesystems check loop above. So we handle it down here, +# after the loop but before the AM_CONDITIONAL m4 loop. +############################################# +# # An attempt to "do the right thing" with as little help from the end-user as # possible: # - if 'with-pvfs2' given, use that to find pvfs2-config. complain if we @@ -1158,6 +1198,21 @@ fi if test "$PVFS2_CONFIG" = "notfound" -a -n "$with_pvfs2" ; then AC_MSG_ERROR([pvfs2-config not found in $with_pvfs2]) fi +############################################# + + +# Setup an AM_CONDITIONAL named BUILD_AD_FOO for use in each adio's Makefile.mk. +# This must come *after* the condition becomes valid, in this case after all +# $file_system_foo variables have been set. +# +# If you fiddle with this, please watch the m4 quoting carefully. m4_foreach +# expands any macros in the "list" argument exactly once. The defn bits ensure +# that any macro names in "fs"'s value will not be expanded, such as if someone +# is daft enough to "m4_define([ufs],[some crazy value])". +m4_foreach([fs],[known_filesystems_m4],[ +AM_CONDITIONAL([BUILD_AD_]m4_toupper(defn([fs])),[test x$file_system_]defn([fs])[ = x1]) +]) + # # Print list of configured file systems @@ -1167,6 +1222,7 @@ fi AC_MSG_CHECKING([configured file systems]) AC_MSG_RESULT([$FILE_SYSTEM]) + if test -n "$file_system_nfs" ; then AC_DEFINE(ROMIO_NFS,1,[Define for ROMIO with NFS]) AC_MSG_WARN([File locks may not work with NFS. See the Installation and @@ -1182,11 +1238,21 @@ fi if test -n "$file_system_bgl"; then AC_DEFINE(ROMIO_BGL,1,[Define for ROMIO with BGL]) fi +if test -n "$file_system_bg"; then + AC_DEFINE(ROMIO_BG,1,[Define for ROMIO with BG]) +fi if test -n "$file_system_bglockless"; then - if test x"$file_system_bgl" = x ; then - AC_MSG_ERROR("bglockless requested without bgl") + if test x"$file_system_bgl" != x; then + AC_DEFINE(ROMIO_BGLOCKLESS,1,[Define for lock-free ROMIO with BGL]) + fi + + if test x"$file_system_bg" != x; then + AC_DEFINE(ROMIO_BGLOCKLESS,1,[Define for lock-free ROMIO with BG]) + fi + + if test x"$ROMIO_BGLOCKLESS" -ne x1; then + AC_MSG_ERROR("bglockless requested without [bgl|bg]") fi - AC_DEFINE(ROMIO_BGLOCKLESS,1,[Define for lock-free ROMIO with BGL]) fi if test -n "$file_system_hfs"; then AC_DEFINE(ROMIO_HFS,1,[Define for ROMIO with HFS]) @@ -1208,13 +1274,7 @@ fi if test -n "$file_system_lustre"; then AC_CHECK_HEADERS(lustre/lustre_user.h, AC_DEFINE(ROMIO_LUSTRE,1,[Define for ROMIO with LUSTRE]), - AC_MSG_ERROR([LUSTRE support requested but cannot find lustre/lustre_user.h header file]), - [ - #include - #ifdef __linux__ - #include - #endif - ] + AC_MSG_ERROR([LUSTRE support requested but cannot find lustre/lustre_user.h header file]) ) fi @@ -1341,7 +1401,7 @@ if test -n "$file_system_gridftp"; then AC_DEFINE(ROMIO_GRIDFTP, 1, [Define for ROMIO with gridftp]) fi -if test -n "$file_system_bgl"; then +if test -n "$file_system_bgl" -o -n "$file_system_bg"; then SYSDEP_INC=-I${prefix}/include else SYSDEP_INC= @@ -1780,7 +1840,7 @@ if test -n "$mpi_mpich"; then if test -z "$arch_SX4" ; then MPIOF_H_INCLUDED=1 fi - if test "$FROM_MPICH2" = no; then + if test "$FROM_MPICH" = no; then AC_DEFINE(NEEDS_MPI_TEST,1,[Define if mpi_test needed]) AC_DEFINE(MPICH,1,[Define if using MPICH]) fi @@ -1804,22 +1864,28 @@ fi AC_CHECK_FUNCS(strerror) if test -z "$srcdir" -o "$srcdir" = "." ; then srcdir="$ROMIO_HOME" ; fi AC_SUBST(srcdir) + +# preserve these values across a config.status --recheck +AC_ARG_VAR([master_top_srcdir],[set by the MPICH configure to indicate the MPICH source root]) +AC_ARG_VAR([master_top_builddir],[set by the MPICH configure to indicate the MPICH build root]) + # The master_top_srcdir is the location of the source for the building -# package. This is used only as part of the MPICH2 build, including +# package. This is used only as part of the MPICH build, including # the documentation targets mandoc, htmldoc, and latexdoc if test -z "$master_top_srcdir" ; then - if test "$FROM_MPICH2" = yes ; then + if test "$FROM_MPICH" = yes ; then AC_MSG_WARN([Could not determine master_top_srcdir]) fi fi -AC_SUBST(master_top_srcdir) # # Get the master builddir (which may be imported from above) if test -z "$master_top_builddir" ; then + if test "$FROM_MPICH" = yes ; then + # this variable is essential to proper build operation + AC_MSG_ERROR([Could not determine master_top_srcdir]) + fi master_top_builddir=`pwd` fi -export master_top_builddir -AC_SUBST(master_top_builddir) # Make sure the alternate spelling is used until we clean up all of the code master_topbuild_dir=$master_top_builddir export master_topbuild_dir @@ -1827,14 +1893,12 @@ AC_SUBST(master_topbuild_dir) # The following definitions are needed within adio/common/status_setb.c if test "$FROM_MPICH" = yes ; then - AC_DEFINE(MPICH,1,[Define if compiling within MPICH]) -elif test "$FROM_MPICH2" = yes ; then - AC_DEFINE(ROMIO_INSIDE_MPICH2,1,[Define if compiling within MPICH2]) + AC_DEFINE(ROMIO_INSIDE_MPICH,1,[Define if compiling within MPICH]) elif test "$FROM_MPILAM" = yes ; then AC_DEFINE(MPILAM,1,[Define if compiling within LAM/MPI]) fi -if test "$FROM_MPICH2" = no -a "$FROM_MPICH" = no ; then +if test "$FROM_MPICH" = no ; then if test -z "$LIBNAME"; then LIBNAME="$top_build_dir/lib/libmpio.a" fi @@ -1852,22 +1916,17 @@ else fi fi fi -if test "$FROM_MPICH2" != no ; then - # use the error handlers from MPICH2 +if test "$FROM_MPICH" != no ; then + # use the error handlers from MPICH MPIO_EXTRA_OBJECTS= MPIO_EXTRA_TMP_POBJECTS= MPIO_EXTRA_REAL_POBJECTS= # Use generalized request to get the multiple-completion routines MPIO_REQOBJECTS= - MPIO_REQ_TMP_POBJECTS= - MPIO_REQ_REAL_POBJECTS= fi AC_SUBST(MPIO_EXTRA_OBJECTS) AC_SUBST(MPIO_EXTRA_TMP_POBJECTS) AC_SUBST(MPIO_EXTRA_REAL_POBJECTS) -AC_SUBST(MPIO_REQOBJECTS) -AC_SUBST(MPIO_REQ_TMP_POBJECTS) -AC_SUBST(MPIO_REQ_REAL_POBJECTS) # # Use DOCTEXT instead of doctext AC_CHECK_PROGS(DOCTEXT,doctext,true) @@ -1894,9 +1953,7 @@ fi # TEST_LIBNAME=$LIBNAME MPIRUN=mpirun - -if test "$MPI" = "open_mpi" ; then - +if test $FROM_OMPI = yes ; then # Open MPI does have the status set bytes functionality AC_DEFINE(HAVE_STATUS_SET_BYTES,1,[Define if have MPIR_Status_set_bytes]) @@ -1917,38 +1974,6 @@ if test "$MPI" = "open_mpi" ; then # Open MPI: see comments in mpi-io/mpioprof.h AC_DEFINE(MPIO_BUILD_PROFILING, 1, [hack to make ROMIO build without profiling]) DEFINE_HAVE_MPI_GREQUEST="#define HAVE_MPI_GREQUEST" - -# -# if MPICH, use mpicc in test programs -# -elif test "$FROM_MPICH" = yes ; then - MPICH_HOME=`dirname $ROMIO_HOME` - if test -z "$MPI_BIN_DIR" ; then MPI_BIN_DIR=$MPICH_HOME/bin ; fi - TEST_CC=$MPI_BIN_DIR/mpicc - MPI_LIB="" - ROMIO_INCLUDE="" - USER_CFLAGS="" - USER_FFLAGS="" - TEST_LIBNAME="" - MPIRUN=$MPI_BIN_DIR/mpirun - if test -n "$arch_SX4" || test -n "$arch_hpux" ; then - TEST_F77=$MPI_BIN_DIR/mpif90 - else - TEST_F77=$MPI_BIN_DIR/mpif77 - fi - CC=$MPI_BIN_DIR/mpicc - # A later test will insert the mpi2-other/info and array directories based - # on the value of BUILD_MPI_xxxx. This lets MPICH2 turn these off, - # since MPICH2 provides these routines elsewhere - EXTRA_DIRS="mpi-io/fortran" - # Some older implementations of the ADI do not include the - # MPID_Status_set_bytes routine. This uses either the - # environment variable ADI3_WITHOUT_SET_BYTES or the - # with arg --without-setbytes - if test "$ADI2_WITHOUT_SET_BYTES" != yes -a \ - "$with_setbytes" != no ; then - AC_DEFINE(HAVE_STATUS_SET_BYTES,1,[Define if have MPIR_Status_set_bytes]) - fi elif test $FROM_LAM = yes ; then # LAM does have the status set bytes functionality AC_DEFINE(HAVE_STATUS_SET_BYTES,1,[Define if have MPIR_Status_set_bytes]) @@ -1963,8 +1988,8 @@ elif test $FROM_LAM = yes ; then USER_FFLAGS= TEST_LIBNAME= EXTRA_DIRS="mpi-io/fortran mpi2-other/info mpi2-other/info/fortran mpi2-other/array mpi2-other/array/fortran" -elif test $FROM_MPICH2 = yes ; then - # For now, separate the mpich2 from mpich cases +elif test $FROM_MPICH = yes ; then + # For now, separate the mpich from mpich cases MPICH_HOME=`dirname $ROMIO_HOME` MPICH_HOME=`dirname $MPICH_HOME` MPICH_HOME=`dirname $MPICH_HOME` @@ -1976,25 +2001,25 @@ elif test $FROM_MPICH2 = yes ; then # MPI_LIB="$LIBNAME" # To allow ROMIO to work with the LIBTOOL scripts, we want to # work directly with the CC, not the mpicc, compiler. - # Note that in the "FROM_MPICH2" case, the CPPFLAGS and INCLUDES are already + # Note that in the "FROM_MPICH" case, the CPPFLAGS and INCLUDES are already # properly set #CC=${top_build_dir}/bin/mpicc # - # set the compilers to the ones in MPICH2 bin directory (master_top_builddir/bin) - TEST_CC=${master_top_builddir}/bin/mpicc - TEST_F77=${master_top_builddir}/bin/mpif77 + # set the compilers to the ones in MPICH bin directory (master_top_builddir/bin) + TEST_CC='$(bindir)/mpicc' + TEST_F77='$(bindir)/mpif77' + MPI_H_INCLUDE="-I${master_top_builddir}/src/include" ROMIO_INCLUDE="" USER_CFLAGS="" USER_FFLAGS="" TEST_LIBNAME="" - MPIRUN=${master_top_builddir}/bin/mpiexec + MPIRUN='${bindir}/mpiexec' # # Turn off the building of the Fortran interface and the Info routines EXTRA_DIRS="" AC_DEFINE(HAVE_STATUS_SET_BYTES,1,[Define if status_set_bytes available]) DEFINE_HAVE_MPI_GREQUEST="#define HAVE_MPI_GREQUEST 1" -# Open MPI does not have the MPIU functions -# AC_DEFINE(HAVE_MPIU_FUNCS,1,[Define if MPICH2 memory tracing macros defined]) + AC_DEFINE(HAVE_MPIU_FUNCS,1,[Define if MPICH memory tracing macros defined]) fi # # @@ -2056,33 +2081,39 @@ FILE_SYS_DIRS="" for dir in $FILE_SYSTEM ; do FILE_SYS_DIRS="$FILE_SYS_DIRS adio/ad_$dir" done +# FIXME eliminate FILE_SYS_DIRS and EXTRA_SRC_DIRS EXTRA_SRC_DIRS="" -GLUE_DIR="" -if test "$FROM_MPICH2" = yes -o "${MPI}_mpi" = "mpich2_mpi"; then - GLUE_DIR="mpi-io/glue/mpich2" -elif test "$FROM_MPICH" = yes -o "${MPI}_mpi" = "mpich_mpi"; then - GLUE_DIR="mpi-io/glue/mpich1" + +mpio_glue="" +if test "$FROM_MPICH" = yes -o "${MPI_IMPL}_mpi" = "mpich_mpi"; then + mpio_glue=mpich +elif test "$FROM_OMPI" = yes -o "${MPI_IMPL}_mpi" = "open_mpi_mpi" ; then + mpio_glue=openmpi else - GLUE_DIR="mpi-io/glue/default" + mpio_glue=default fi + +AM_CONDITIONAL([MPIO_GLUE_MPICH],[test "X$mpio_glue" = "Xmpich"]) +AM_CONDITIONAL([MPIO_GLUE_OPENMPI],[test "X$mpio_glue" = "Xopenmpi"]) +AM_CONDITIONAL([MPIO_GLUE_DEFAULT],[test "X$mpio_glue" = "Xdefault"]) + if test "$BUILD_MPI_INFO" = 1 ; then EXTRA_SRC_DIRS="$EXTRA_SRC_DIRS mpi2-other/info" - if test "$NOF77" = 0 -a "$FROM_MPICH2" != yes ; then + if test "$NOF77" = 0 -a "$FROM_MPICH" != yes ; then EXTRA_SRC_DIRS="$EXTRA_SRC_DIRS mpi2-other/info/fortran" fi fi if test "$BUILD_MPI_ARRAY" = 1 ; then EXTRA_SRC_DIRS="$EXTRA_SRC_DIRS mpi2-other/array" - if test "$NOF77" = 0 -a "$FROM_MPICH2" != yes ; then + if test "$NOF77" = 0 -a "$FROM_MPICH" != yes ; then EXTRA_SRC_DIRS="$EXTRA_SRC_DIRS mpi2-other/array/fortran" fi fi -if test "$NOF77" = 0 -a "$FROM_MPICH2" != yes ; then +if test "$NOF77" = 0 -a "$FROM_MPICH" != yes ; then EXTRA_SRC_DIRS="$EXTRA_SRC_DIRS mpi-io/fortran" fi AC_SUBST(EXTRA_SRC_DIRS) AC_SUBST(FILE_SYS_DIRS) -AC_SUBST(GLUE_DIR) # CFLAGS="$CFLAGS -DHAVE_ROMIOCONF_H" @@ -2118,10 +2149,7 @@ AC_SUBST(SYSDEP_INC) # need to #defines to agree). AC_C_RESTRICT PAC_C_GNU_ATTRIBUTE -# -dnl CFLAGS="$CFLAGS $DEFS" -CFLAGS="$CFLAGS -DHAVE_ROMIOCONF_H" -# + # Open MPI: we need libtool AM_PROG_LIBTOOL @@ -2130,6 +2158,9 @@ AM_PROG_LIBTOOL [bgl, bglockless, gridftp, lustre, nfs, panfs, pfs, pvfs, pvfs2, sfs, testfs, ufs, xfs, zoidfs], [AM_CONDITIONAL(BUILD_[]AS_TR_CPP(my_fs), [test -n "$file_system_]my_fs["])]) +# support gcov test coverage information +PAC_ENABLE_COVERAGE + echo "setting CC to $CC" echo "setting F77 to $F77" echo "setting TEST_CC to $TEST_CC" @@ -2144,8 +2175,6 @@ CFLAGS="$CFLAGS $OMPI_CFLAGS "'-I$(top_builddir)/include' # # Open MPI - AM doesn't want the following: # VPATH, CC, CPPFLAGS, CFLAGS, AR, RANLIB, F77, MAKE -#VPATH='VPATH = .:${srcdir}' -#AC_SUBST(VPATH)# AC_SUBST(ARCH) AC_SUBST(FILE_SYSTEM) #AC_SUBST(CC) @@ -2155,9 +2184,8 @@ AC_SUBST(USER_CFLAGS) AC_SUBST(USER_FFLAGS) AC_SUBST(MIPS) AC_SUBST(BITS) -AC_SUBST(MPI) #AC_SUBST(AR) -#AC_SUBST(RANLIB) +AC_SUBST(AR_FLAGS) AC_SUBST(MPI_INCLUDE_DIR) AC_SUBST(MPI_LIB) #AC_SUBST(F77) @@ -2175,7 +2203,6 @@ AC_SUBST(F77MPIOINC) AC_SUBST(FTESTDEFINE) AC_SUBST(FORTRAN_MPI_OFFSET) AC_SUBST(FROM_MPICH) -AC_SUBST(FROM_MPICH2) AC_SUBST(FROM_LAM) AC_SUBST(WITHIN_KNOWN_MPI_IMPL) AC_SUBST(NEEDS_MPI_FINT) @@ -2199,7 +2226,6 @@ AC_SUBST(MPI_FARRAY6) AC_SUBST(MPI_FARRAY7) AC_SUBST(MPI_OFFSET_KIND1) AC_SUBST(MPI_OFFSET_KIND2) -AC_SUBST(MPIO_REQOBJECTS) AC_SUBST(TEST_CC) AC_SUBST(TEST_F77) AC_SUBST(ROMIO_INCLUDE) @@ -2209,11 +2235,6 @@ AC_SUBST(ROMIO_TCPPFLAGS) AC_SUBST(ROMIO_TFFLAGS) AC_SUBST(MPIRUN) AC_SUBST(FORTRAN_TEST) -dnl -# Open MPI - not needed with AM -#dnl Dependency handling -#AC_SUBST(MAKE_DEPEND_C) -# Open MPI - LT / AM does all this for us... #dnl #dnl Support shared libraries #if test -z "$ENABLE_SHLIB" ; then @@ -2228,89 +2249,45 @@ dnl #SHLIBNAME=`echo $LIBNAME | sed 's/\.a$//'` #AC_SUBST(SHLIBNAME) #dnl -# Open MPI: This is no longer necessary with modern versions of autotools #if test ! -d adio ; then mkdir adio ; fi #if test ! -d adio/include ; then mkdir adio/include ; fi #if test ! -d mpi2-other ; then mkdir mpi2-other ; fi #if test ! -d mpi-io ; then mkdir mpi-io ; fi #if test ! -d mpi-io/glue ; then mkdir mpi-io/glue ; fi -# -# Make sure we remove any configuration file incase there is out-of-date data. -# We remove the version in include in case this is a vpath build -# Open MPI: no longer needed with modern AC -#rm -f adio/include/romioconf.h ${use_top_srcdir}/src/mpi/romio/adio/include/romioconf.h ${use_top_srcdir}/adio/include/romioconf.h -# + # Create makefiles for all of the adio devices. Only the ones that # are active will be called by the top level ROMIO make AC_OUTPUT_COMMANDS([chmod 755 util/romioinstall test/runtests]) -# Open MPI: revamp AC_OUTPUT lines to fit Makefile.am's AC_CONFIG_FILES([ Makefile - localdefs - - adio/Makefile - adio/ad_bgl/Makefile - adio/ad_bglockless/Makefile - adio/ad_gridftp/Makefile - adio/ad_lustre/Makefile - adio/ad_nfs/Makefile - adio/ad_ntfs/Makefile - adio/ad_panfs/Makefile - adio/ad_pfs/Makefile - adio/ad_pvfs/Makefile - adio/ad_pvfs2/Makefile - adio/ad_sfs/Makefile - adio/ad_testfs/Makefile - adio/ad_ufs/Makefile - adio/ad_xfs/Makefile - adio/ad_zoidfs/Makefile - adio/common/Makefile - adio/include/Makefile - - doc/Makefile - - include/mpio.h - include/mpiof.h - include/Makefile - - mpi-io/Makefile - + localdefs test/Makefile test/misc.c test/large_file.c + test/runtests + test-internal/Makefile + util/romioinstall + include/mpio.h test/fmisc.f test/fcoll_test.f test/pfcoll_test.f test/fperf.f - test/runtests - - util/romioinstall - - mpi-io/glue/openmpi/Makefile - - util/Makefile ]) # Open MPI: intentionally skip the following: # mpi2-other/info/Makefile -# mpi2-other/info/fortran/Makefile # mpi2-other/array/Makefile +# mpi2-other/info/fortran/Makefile # mpi2-other/array/fortran/Makefile -# mpi-io/fortran/Makefile -# mpi-io/glue/mpich2/Makefile -# mpi-io/glue/mpich1/Makefile -# mpi-io/glue/default/Makefile -# Open MPI: according to romio-maint@mcs.anl.gov: -# adio/ad_hfs/Makefile: old and no longer used -# adio/ad_ntfs/Makefile: not built with GNU Autotools -# adio/ad_piofs/Makefile: old and no longer used +# include/mpiof.h AC_OUTPUT -# + + # # Open MPI - don't need to remove this... -# rm -f *.o +#rm -f *.o # Open MPI - don't need this extra printf -#if test $FROM_MPICH = no -a $FROM_MPICH2 = no ; then +#if test $FROM_MPICH = no ; then # AC_MSG_RESULT([Configure done. Now type make.]) #fi dnl PAC_SUBDIR_CACHE_CLEANUP diff --git a/ompi/mca/io/romio/romio/doc/makepubpage.sh b/ompi/mca/io/romio/romio/doc/makepubpage.sh old mode 100644 new mode 100755 diff --git a/ompi/mca/io/romio/romio/doc/source-guide.tex b/ompi/mca/io/romio/romio/doc/source-guide.tex index 3e1f7f8434..96fa7ca58d 100644 --- a/ompi/mca/io/romio/romio/doc/source-guide.tex +++ b/ompi/mca/io/romio/romio/doc/source-guide.tex @@ -95,7 +95,7 @@ by \\ [2ex] \begin{abstract} \noindent ROMIO is a high-performance, portable implementation of MPI-IO (the -I/O chapter in \mbox{MPI-2}). +I/O chapter in the \mbox{MPI Standard}). This document describes the internals of the ROMIO implementation. \end{abstract} @@ -121,7 +121,7 @@ where those components are located in the ROMIO source tree. The ROMIO directory structure consists of two main branches, the MPI-IO branch (mpi-io) and the ADIO branch (adio). The MPI-IO branch contains code that -implements the functions defined in the MPI-2 specification for I/O, such as +implements the functions defined in the MPI specification for I/O, such as MPI\_File\_open. These functions are then written in terms of other functions that provide an abstract interface to I/O resources, the ADIO functions. There is an additional glue subdirectory in the MPI-IO branch that defines @@ -369,7 +369,7 @@ Currently ROMIO implements shared file pointers by storing the file pointer value in a separate file... Note that the ROMIO team has devised a portable method for implementing shared -file pointers using only MPI-1 and MPI-2 functions. However, this method has +file pointers using only MPI functions. However, this method has not yet been implemented in ROMIO. file name is selected at end of mpi-io/open.c. diff --git a/ompi/mca/io/romio/romio/doc/users-guide.pdf b/ompi/mca/io/romio/romio/doc/users-guide.pdf index 35bb792ee88edc11985cbcfe6c8e692b0bab095a..83c4e04057faefae9f4d360d7e2e51dea40c958c 100644 GIT binary patch literal 105356 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 z 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 ci2EmdG4P3Szf>2|Np$0GiSNZbf~S)M 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 z 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%0A=B)cKBjy~{$Vjx7>XN6P4m09BBpgWSk! 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 diff --git a/ompi/mca/io/romio/romio/doc/users-guide.tex b/ompi/mca/io/romio/romio/doc/users-guide.tex index b19c61ad65..f80866b4e0 100644 --- a/ompi/mca/io/romio/romio/doc/users-guide.tex +++ b/ompi/mca/io/romio/romio/doc/users-guide.tex @@ -94,7 +94,7 @@ by \\ [2ex] \begin{abstract} \noindent ROMIO is a high-performance, portable implementation of MPI-IO (the -I/O chapter in \mbox{MPI-2}). This document describes how to install and use +I/O chapter in the \mbox{MPI Standard}). This document describes how to install and use ROMIO version~1.2.4 on various machines. \end{abstract} @@ -102,7 +102,7 @@ ROMIO version~1.2.4 on various machines. ROMIO\footnote{\tt http://www.mcs.anl.gov/romio} is a high-performance, portable implementation of MPI-IO (the I/O chapter in -MPI-2~\cite{mpi97a}). This document describes how to install and use +MPI~\cite{mpi97a}). This document describes how to install and use ROMIO version~1.2.4 on various machines. @@ -124,8 +124,8 @@ ROMIO version~1.2.4 on various machines. % \section{General Information} -This version of ROMIO includes everything defined in the MPI-2 I/O -chapter except support for file interoperability (\S~9.5 of MPI-2) and +This version of ROMIO includes everything defined in the MPI I/O +chapter except support for file interoperability and user-defined error handlers for files (\S~4.13.3). The subarray and distributed array datatype constructor functions from Chapter 4 (\S~4.14.4 \& \S~4.14.5) have been implemented. They are useful for @@ -324,7 +324,7 @@ these collective buffering hints). Further, in the ROMIO implementation the hint is only recognized at \texttt{MPI\_File\_open} time. The set of hints used with a file is available through the routine -\texttt{MPI\_File\_get\_info}, as documented in the MPI-2 standard. +\texttt{MPI\_File\_get\_info}, as documented in the MPI standard. As an additional feature in the ROMIO implementation, wildcards will be expanded to indicate the precise configuration used with the file, with the hostnames in the rank order used for the collective buffering @@ -355,7 +355,7 @@ that they are listed in \texttt{cb\_config\_list}. The following hint controls the deferred open feature of romio and are also applicable to all file system types: \begin{itemize} -\item \texttt{no\_indep\_rw} -- If the application plans on performing only +\item \texttt{romio\_no\_indep\_rw} -- If the application plans on performing only collecitve operations and this hint is set to ``true'', then ROMIO can have just the aggregators open a file. The \texttt{cb\_config\_list} and \texttt{cb\_nodes} hints can be given to further control which nodes are @@ -654,7 +654,7 @@ the ADIO implementation in order to get the specific output they desire. \subsection{ROMIO and {\tt MPI\_FILE\_SYNC}} -The MPI-2 specification notes that a call to {\tt MPI\_FILE\_SYNC} ``causes +The MPI specification notes that a call to {\tt MPI\_FILE\_SYNC} ``causes all previous writes to {\tt fh} by the calling process to be transferred to the storage device.'' Likewise, calls to {\tt MPI\_FILE\_CLOSE} have this same semantic. Further, ``if all processes have made updates to the storage @@ -1002,9 +1002,9 @@ therefore used as the default. \subsection{Major Changes in Version 1.0.2} \begin{itemize} -\item Implemented the shared file pointer functions (\S~9.4.4 of MPI-2) and - split collective I/O functions (\S~9.4.5). Therefore, the main - components of the MPI-2 I/O chapter not yet implemented are +\item Implemented the shared file pointer functions and + split collective I/O functions. Therefore, the main + components of the MPI I/O chapter not yet implemented are file interoperability and error handling. \item Added support for using ``direct I/O'' on SGI's XFS file system. diff --git a/ompi/mca/io/romio/romio/include/Makefile.am b/ompi/mca/io/romio/romio/include/Makefile.am deleted file mode 100644 index 7466ca559a..0000000000 --- a/ompi/mca/io/romio/romio/include/Makefile.am +++ /dev/null @@ -1,22 +0,0 @@ -# -# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana -# University Research and Technology -# Corporation. All rights reserved. -# Copyright (c) 2004-2005 The University of Tennessee and The University -# of Tennessee Research Foundation. All rights -# reserved. -# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, -# University of Stuttgart. All rights reserved. -# Copyright (c) 2004-2005 The Regents of the University of California. -# All rights reserved. -# $COPYRIGHT$ -# -# Additional copyrights may follow -# -# $HEADER$ -# - -include $(top_srcdir)/Makefile.options - -noinst_HEADERS = io_romio_conv.h -nodist_noinst_HEADERS = mpio.h diff --git a/ompi/mca/io/romio/romio/include/mpio.h.in b/ompi/mca/io/romio/romio/include/mpio.h.in index 3f94402ade..09be167912 100644 --- a/ompi/mca/io/romio/romio/include/mpio.h.in +++ b/ompi/mca/io/romio/romio/include/mpio.h.in @@ -20,6 +20,7 @@ #define MPIIMPL_HAVE_MPI_COMBINER_SUBARRAY 1 #define MPIIMPL_HAVE_MPI_TYPE_CREATE_DARRAY 1 #define MPIIMPL_HAVE_MPI_COMBINER_DUP 1 +#define MPICH_ATTR_POINTER_WITH_TYPE_TAG(x,y) #if defined(__cplusplus) extern "C" { @@ -89,10 +90,10 @@ typedef int MPI_Fint; #define MPI_DISPLACEMENT_CURRENT -54278278 -#ifndef MPICH2 +#ifndef MPICH /* FIXME: Make sure that we get a consistent definition of MPI_FILE_NULL - in MPICH2 */ -/* MPICH2 defines null object handles differently */ + in MPICH */ +/* MPICH defines null object handles differently */ #define MPI_FILE_NULL ((MPI_File) 0) #endif #define MPIO_REQUEST_NULL ((MPIO_Request) 0) @@ -129,120 +130,136 @@ typedef int MPI_Fint; /* Section 9.2 */ /* Begin Prototypes */ -int MPI_File_open(MPI_Comm, char *, int, MPI_Info, MPI_File *); -int MPI_File_close(MPI_File *); -int MPI_File_delete(char *, MPI_Info); -int MPI_File_set_size(MPI_File, MPI_Offset); -int MPI_File_preallocate(MPI_File, MPI_Offset); -int MPI_File_get_size(MPI_File, MPI_Offset *); -int MPI_File_get_group(MPI_File, MPI_Group *); -int MPI_File_get_amode(MPI_File, int *); -int MPI_File_set_info(MPI_File, MPI_Info); -int MPI_File_get_info(MPI_File, MPI_Info *); +int MPI_File_open(MPI_Comm comm, const char *filename, int amode, MPI_Info info, MPI_File *fh); +int MPI_File_close(MPI_File *fh); +int MPI_File_delete(const char *filename, MPI_Info info); +int MPI_File_set_size(MPI_File fh, MPI_Offset size); +int MPI_File_preallocate(MPI_File fh, MPI_Offset size); +int MPI_File_get_size(MPI_File fh, MPI_Offset *size); +int MPI_File_get_group(MPI_File fh, MPI_Group *group); +int MPI_File_get_amode(MPI_File fh, int *amode); +int MPI_File_set_info(MPI_File fh, MPI_Info info); +int MPI_File_get_info(MPI_File fh, MPI_Info *info_used); /* Section 9.3 */ -int MPI_File_set_view(MPI_File, MPI_Offset, MPI_Datatype, - MPI_Datatype, char *, MPI_Info); -int MPI_File_get_view(MPI_File, MPI_Offset *, - MPI_Datatype *, MPI_Datatype *, char *); +int MPI_File_set_view(MPI_File fh, MPI_Offset disp, MPI_Datatype etype, MPI_Datatype filetype, + const char *datarep, MPI_Info info); +int MPI_File_get_view(MPI_File fh, MPI_Offset *disp, MPI_Datatype *etype, MPI_Datatype *filetype, + char *datarep); /* Section 9.4.2 */ -int MPI_File_read_at(MPI_File, MPI_Offset, void *, - int, MPI_Datatype, MPI_Status *); -int MPI_File_read_at_all(MPI_File, MPI_Offset, void *, - int, MPI_Datatype, MPI_Status *); -int MPI_File_write_at(MPI_File, MPI_Offset, void *, - int, MPI_Datatype, MPI_Status *); -int MPI_File_write_at_all(MPI_File, MPI_Offset, void *, - int, MPI_Datatype, MPI_Status *); +int MPI_File_read_at(MPI_File fh, MPI_Offset offset, void *buf, int count, MPI_Datatype datatype, + MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5); +int MPI_File_read_at_all(MPI_File fh, MPI_Offset offset, void * buf, int count, + MPI_Datatype datatype, MPI_Status *status) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5); +int MPI_File_write_at(MPI_File fh, MPI_Offset offset, const void * buf, int count, + MPI_Datatype datatype, MPI_Status *status) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5); +int MPI_File_write_at_all(MPI_File fh, MPI_Offset offset, const void *buf, int count, + MPI_Datatype datatype, MPI_Status *status) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5); /* nonblocking calls currently use MPIO_Request, because generalized requests not yet implemented. For the same reason, MPIO_Test and MPIO_Wait are used to test and wait on nonblocking I/O requests */ - -int MPI_File_iread_at(MPI_File, MPI_Offset, void *, - int, MPI_Datatype, MPIO_Request *); -int MPI_File_iwrite_at(MPI_File, MPI_Offset, void *, - int, MPI_Datatype, MPIO_Request *); +int MPI_File_iread_at(MPI_File fh, MPI_Offset offset, void *buf, int count, MPI_Datatype datatype, + MPIO_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5); +int MPI_File_iwrite_at(MPI_File fh, MPI_Offset offset, const void *buf, int count, + MPI_Datatype datatype, MPIO_Request *request) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5); /* Section 9.4.3 */ -int MPI_File_read(MPI_File, void *, int, MPI_Datatype, MPI_Status *); -int MPI_File_read_all(MPI_File, void *, int, MPI_Datatype, MPI_Status *); -int MPI_File_write(MPI_File, void *, int, MPI_Datatype, MPI_Status *); -int MPI_File_write_all(MPI_File, void *, int, MPI_Datatype, MPI_Status *); +int MPI_File_read(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPI_Status *status) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); +int MPI_File_read_all(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPI_Status *status) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); +int MPI_File_write(MPI_File fh, const void *buf, int count, MPI_Datatype datatype, + MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); +int MPI_File_write_all(MPI_File fh, const void *buf, int count, MPI_Datatype datatype, + MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); /* nonblocking calls currently use MPIO_Request, because generalized requests not yet implemented. For the same reason, MPIO_Test and MPIO_Wait are used to test and wait on nonblocking I/O requests */ -int MPI_File_iread(MPI_File, void *, int, MPI_Datatype, MPIO_Request *); -int MPI_File_iwrite(MPI_File, void *, int, MPI_Datatype, MPIO_Request *); +int MPI_File_iread(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPIO_Request *request) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); +int MPI_File_iwrite(MPI_File fh, const void *buf, int count, MPI_Datatype datatype, + MPIO_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); -int MPI_File_seek(MPI_File, MPI_Offset, int); -int MPI_File_get_position(MPI_File, MPI_Offset *); -int MPI_File_get_byte_offset(MPI_File, MPI_Offset, MPI_Offset *); +int MPI_File_seek(MPI_File fh, MPI_Offset offset, int whence); +int MPI_File_get_position(MPI_File fh, MPI_Offset *offset); +int MPI_File_get_byte_offset(MPI_File fh, MPI_Offset offset, MPI_Offset *disp); /* Section 9.4.4 */ -int MPI_File_read_shared(MPI_File, void *, int, MPI_Datatype, MPI_Status *); -int MPI_File_write_shared(MPI_File, void *, int, MPI_Datatype, MPI_Status *); -int MPI_File_iread_shared(MPI_File, void *, int, MPI_Datatype, MPIO_Request *); -int MPI_File_iwrite_shared(MPI_File, void *, int, - MPI_Datatype, MPIO_Request *); -int MPI_File_read_ordered(MPI_File, void *, int, - MPI_Datatype, MPI_Status *); -int MPI_File_write_ordered(MPI_File, void *, int, - MPI_Datatype, MPI_Status *); -int MPI_File_seek_shared(MPI_File, MPI_Offset, int); -int MPI_File_get_position_shared(MPI_File, MPI_Offset *); +int MPI_File_read_shared(MPI_File fh, void *buf, int count, MPI_Datatype datatype, + MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); +int MPI_File_write_shared(MPI_File fh, const void *buf, int count, MPI_Datatype datatype, + MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); +int MPI_File_iread_shared(MPI_File fh, void *buf, int count, MPI_Datatype datatype, + MPIO_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); +int MPI_File_iwrite_shared(MPI_File fh, const void *buf, int count, MPI_Datatype datatype, + MPIO_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); +int MPI_File_read_ordered(MPI_File fh, void *buf, int count, MPI_Datatype datatype, + MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); +int MPI_File_write_ordered(MPI_File fh, const void *buf, int count, MPI_Datatype datatype, + MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); +int MPI_File_seek_shared(MPI_File fh, MPI_Offset offset, int whence); +int MPI_File_get_position_shared(MPI_File fh, MPI_Offset *offset); /* Section 9.4.5 */ -int MPI_File_read_at_all_begin(MPI_File, MPI_Offset, void *, - int, MPI_Datatype); -int MPI_File_read_at_all_end(MPI_File, void *, MPI_Status *); -int MPI_File_write_at_all_begin(MPI_File, MPI_Offset, void *, - int, MPI_Datatype); -int MPI_File_write_at_all_end(MPI_File, void *, MPI_Status *); -int MPI_File_read_all_begin(MPI_File, void *, int, MPI_Datatype); -int MPI_File_read_all_end(MPI_File, void *, MPI_Status *); -int MPI_File_write_all_begin(MPI_File, void *, int, MPI_Datatype); -int MPI_File_write_all_end(MPI_File, void *, MPI_Status *); -int MPI_File_read_ordered_begin(MPI_File, void *, int, MPI_Datatype); -int MPI_File_read_ordered_end(MPI_File, void *, MPI_Status *); -int MPI_File_write_ordered_begin(MPI_File, void *, int, MPI_Datatype); -int MPI_File_write_ordered_end(MPI_File, void *, MPI_Status *); +int MPI_File_read_at_all_begin(MPI_File fh, MPI_Offset offset, void *buf, int count, + MPI_Datatype datatype) MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5); +int MPI_File_read_at_all_end(MPI_File fh, void *buf, MPI_Status *status); +int MPI_File_write_at_all_begin(MPI_File fh, MPI_Offset offset, const void *buf, int count, + MPI_Datatype datatype) MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5); +int MPI_File_write_at_all_end(MPI_File fh, const void *buf, MPI_Status *status); +int MPI_File_read_all_begin(MPI_File fh, void *buf, int count, MPI_Datatype datatype) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); +int MPI_File_read_all_end(MPI_File fh, void *buf, MPI_Status *status); +int MPI_File_write_all_begin(MPI_File fh, const void *buf, int count, MPI_Datatype datatype) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); +int MPI_File_write_all_end(MPI_File fh, const void *buf, MPI_Status *status); +int MPI_File_read_ordered_begin(MPI_File fh, void *buf, int count, MPI_Datatype datatype) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); +int MPI_File_read_ordered_end(MPI_File fh, void *buf, MPI_Status *status); +int MPI_File_write_ordered_begin(MPI_File fh, const void *buf, int count, MPI_Datatype datatype) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); +int MPI_File_write_ordered_end(MPI_File fh, const void *buf, MPI_Status *status); /* Section 9.5.1 */ -int MPI_File_get_type_extent(MPI_File, MPI_Datatype, MPI_Aint *); +int MPI_File_get_type_extent(MPI_File fh, MPI_Datatype datatype, MPI_Aint *extent); /* Section 9.5.3 */ -int MPI_Register_datarep(char *, - MPI_Datarep_conversion_function *, - MPI_Datarep_conversion_function *, - MPI_Datarep_extent_function *, - void *); +int MPI_Register_datarep(const char *datarep, MPI_Datarep_conversion_function *read_conversion_fn, + MPI_Datarep_conversion_function *write_conversion_fn, + MPI_Datarep_extent_function *dtype_file_extent_fn, void *extra_state); /* Section 9.6.1 */ -int MPI_File_set_atomicity(MPI_File, int); -int MPI_File_get_atomicity(MPI_File, int *); -int MPI_File_sync(MPI_File); +int MPI_File_set_atomicity(MPI_File fh, int flag); +int MPI_File_get_atomicity(MPI_File fh, int *flag); +int MPI_File_sync(MPI_File fh); /* Section 4.13.3 */ -#ifndef MPICH2 -/* MPICH2 provides these definitions */ -int MPI_File_set_errhandler( MPI_File, MPI_Errhandler ); -int MPI_File_get_errhandler( MPI_File, MPI_Errhandler * ); +#ifndef MPICH +/* MPICH provides these definitions */ +int MPI_File_set_errhandler(MPI_File file, MPI_Errhandler errhandler); +int MPI_File_get_errhandler(MPI_File file, MPI_Errhandler *errhandler); #endif /* End Prototypes */ #ifndef HAVE_MPI_DARRAY_SUBARRAY /* Section 4.14.4 */ -int MPI_Type_create_subarray(int, int *, int *, int *, int, - MPI_Datatype, MPI_Datatype *); +int MPI_Type_create_subarray(int ndims, const int array_of_sizes[], const int array_of_subsizes[], + const int array_of_starts[], int order, MPI_Datatype oldtype, + MPI_Datatype *newtype); /* Section 4.14.5 */ -int MPI_Type_create_darray(int, int, int, - int *, int *, int *, int *, - int, MPI_Datatype, MPI_Datatype *); +int MPI_Type_create_darray(int size, int rank, int ndims, const int array_of_gsizes[], + const int array_of_distribs[], const int array_of_dargs[], + const int array_of_psizes, int order, MPI_Datatype oldtype, + MPI_Datatype *newtype); #endif /* The globus2 device has to rename MPI_ symbols in order to use the vendor @@ -261,39 +278,43 @@ int MPI_Type_create_darray(int, int, int, /* Open MPI: I can't seem to make these #define properly. Oh well -- we don't need them anyway :-( */ #if 0 -MPI_File MPI_File_f2c(MPI_Fint); -MPI_Fint MPI_File_c2f(MPI_File); +MPI_File MPI_File_f2c(MPI_Fint file); +MPI_Fint MPI_File_c2f(MPI_File file); #endif #ifndef HAVE_MPI_GREQUEST /* The following functions are required if generalized requests are not available, because in that case, an MPIO_Request object is currently used for nonblocking I/O. */ -int MPIO_Test(MPIO_Request *, int *, MPI_Status *); -int MPIO_Wait(MPIO_Request *, MPI_Status *); -int MPIO_Testall(int, MPIO_Request *, int *, MPI_Status *); -int MPIO_Waitall(int, MPIO_Request *, MPI_Status *); -int MPIO_Testany(int, MPIO_Request *, int *, int *, MPI_Status *); -int MPIO_Waitany(int, MPIO_Request *, int *, MPI_Status *); -int MPIO_Waitsome(int, MPIO_Request *, int *, int *, MPI_Status *); -int MPIO_Testsome(int, MPIO_Request *, int *, int *, MPI_Status *); +int MPIO_Test(MPIO_Request *request, int *flag, MPI_Status *status); +int MPIO_Wait(MPIO_Request *request, MPI_Status *status); +int MPIO_Testall(int count, MPIO_Request array_of_requests[], int *flag, + MPI_Status array_of_statuses[]); +int MPIO_Waitall(int count, MPIO_Request array_of_requests[], MPI_Status array_of_statuses[]); +int MPIO_Testany(int count, MPIO_Request array_of_requests[], int *indx, int *flag, + MPI_Status *status); +int MPIO_Waitany(int count, MPIO_Request array_of_requests[], int *indx, MPI_Status *status); +int MPIO_Waitsome(int incount, MPIO_Request array_of_requests[], int *outcount, + int array_of_indices[], MPI_Status array_of_statuses[]); +int MPIO_Testsome(int incount, MPIO_Request array_of_requests[], int *outcount, + int array_of_indices[], MPI_Status array_of_statuses[]); -MPI_Fint MPIO_Request_c2f(MPIO_Request); -MPIO_Request MPIO_Request_f2c(MPI_Fint); +MPI_Fint MPIO_Request_c2f(MPIO_Request request); +MPIO_Request MPIO_Request_f2c(MPI_Fint request); #endif /* HAVE_MPI_GREQUEST */ /* info functions if not defined in the MPI implementation */ #ifndef HAVE_MPI_INFO -int MPI_Info_create(MPI_Info *); -int MPI_Info_set(MPI_Info, char *, char *); -int MPI_Info_delete(MPI_Info, char *); -int MPI_Info_get(MPI_Info, char *, int, char *, int *); -int MPI_Info_get_valuelen(MPI_Info, char *, int *, int *); -int MPI_Info_get_nkeys(MPI_Info, int *); -int MPI_Info_get_nthkey(MPI_Info, int, char *); -int MPI_Info_dup(MPI_Info, MPI_Info *); -int MPI_Info_free(MPI_Info *); +int MPI_Info_create(MPI_Info *info); +int MPI_Info_set(MPI_Info info, const char *key, const char *value); +int MPI_Info_delete(MPI_Info info, const char *key); +int MPI_Info_get(MPI_Info info, const char *key, int valuelen, char *value, int *flag); +int MPI_Info_get_valuelen(MPI_Info info, const char *key, int *valuelen, int *flag); +int MPI_Info_get_nkeys(MPI_Info info, int *nkeys); +int MPI_Info_get_nthkey(MPI_Info info, int n, char *key); +int MPI_Info_dup(MPI_Info info, MPI_Info *newinfo); +int MPI_Info_free(MPI_Info *info); /* The globus2 device has to rename MPI_ symbols in order to use the vendor MPI as one of its transport mechanisms. Therefore, the following undefines @@ -309,8 +330,8 @@ int MPI_Info_free(MPI_Info *); /* above needed for some versions of mpi.h in MPICH!! */ /* Open MPI: we don't need these in ROMIO */ #if 0 -MPI_Fint MPI_Info_c2f(MPI_Info); -MPI_Info MPI_Info_f2c(MPI_Fint); +MPI_Fint MPI_Info_c2f(MPI_Info info); +MPI_Info MPI_Info_f2c(MPI_Fint info); #endif #endif @@ -322,10 +343,11 @@ MPI_Info MPI_Info_f2c(MPI_Fint); /* Open MPI: We don't want any of the profiling layer */ #if 0 + /* Section 9.2 */ -int PMPI_File_open(MPI_Comm, char *, int, MPI_Info, MPI_File *); +int PMPI_File_open(MPI_Comm, const char *, int, MPI_Info, MPI_File *); int PMPI_File_close(MPI_File *); -int PMPI_File_delete(char *, MPI_Info); +int PMPI_File_delete(const char *, MPI_Info); int PMPI_File_set_size(MPI_File, MPI_Offset); int PMPI_File_preallocate(MPI_File, MPI_Offset); int PMPI_File_get_size(MPI_File, MPI_Offset *); @@ -336,79 +358,103 @@ int PMPI_File_get_info(MPI_File, MPI_Info *); /* Section 9.3 */ int PMPI_File_set_view(MPI_File, MPI_Offset, - MPI_Datatype, MPI_Datatype, char *, MPI_Info); + MPI_Datatype, MPI_Datatype, const char *, MPI_Info); int PMPI_File_get_view(MPI_File, MPI_Offset *, MPI_Datatype *, MPI_Datatype *, char *); /* Section 9.4.2 */ int PMPI_File_read_at(MPI_File, MPI_Offset, void *, - int, MPI_Datatype, MPI_Status *); + int, MPI_Datatype, MPI_Status *) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5); int PMPI_File_read_at_all(MPI_File, MPI_Offset, void *, - int, MPI_Datatype, MPI_Status *); -int PMPI_File_write_at(MPI_File, MPI_Offset, void *, - int, MPI_Datatype, MPI_Status *); -int PMPI_File_write_at_all(MPI_File, MPI_Offset, void *, - int, MPI_Datatype, MPI_Status *); + int, MPI_Datatype, MPI_Status *) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5); +int PMPI_File_write_at(MPI_File, MPI_Offset, const void *, + int, MPI_Datatype, MPI_Status *) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5); +int PMPI_File_write_at_all(MPI_File, MPI_Offset, const void *, + int, MPI_Datatype, MPI_Status *) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5); /* nonblocking calls currently use MPIO_Request, because generalized requests not yet implemented. For the same reason, MPIO_Test and MPIO_Wait are used to test and wait on nonblocking I/O requests */ int PMPI_File_iread_at(MPI_File, MPI_Offset, void *, - int, MPI_Datatype, MPIO_Request *); -int PMPI_File_iwrite_at(MPI_File, MPI_Offset, void *, - int, MPI_Datatype, MPIO_Request *); + int, MPI_Datatype, MPIO_Request *) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5); +int PMPI_File_iwrite_at(MPI_File, MPI_Offset, const void *, + int, MPI_Datatype, MPIO_Request *) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5); /* Section 9.4.3 */ -int PMPI_File_read(MPI_File, void *, int, MPI_Datatype, MPI_Status *); -int PMPI_File_read_all(MPI_File, void *, int, MPI_Datatype, MPI_Status *); -int PMPI_File_write(MPI_File, void *, int, MPI_Datatype, MPI_Status *); -int PMPI_File_write_all(MPI_File, void *, int, MPI_Datatype, MPI_Status *); +int PMPI_File_read(MPI_File, void *, int, MPI_Datatype, MPI_Status *) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); +int PMPI_File_read_all(MPI_File, void *, int, MPI_Datatype, MPI_Status *) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); +int PMPI_File_write(MPI_File, const void *, int, MPI_Datatype, MPI_Status *) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); +int PMPI_File_write_all(MPI_File, const void *, int, MPI_Datatype, MPI_Status *) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); /* nonblocking calls currently use MPIO_Request, because generalized requests not yet implemented. For the same reason, MPIO_Test and MPIO_Wait are used to test and wait on nonblocking I/O requests */ -int PMPI_File_iread(MPI_File, void *, int, MPI_Datatype, MPIO_Request *); -int PMPI_File_iwrite(MPI_File, void *, int, MPI_Datatype, MPIO_Request *); +int PMPI_File_iread(MPI_File, void *, int, MPI_Datatype, MPIO_Request *) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); +int PMPI_File_iwrite(MPI_File, const void *, int, MPI_Datatype, MPIO_Request *) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); int PMPI_File_seek(MPI_File, MPI_Offset, int); int PMPI_File_get_position(MPI_File, MPI_Offset *); int PMPI_File_get_byte_offset(MPI_File, MPI_Offset, MPI_Offset *); /* Section 9.4.4 */ -int PMPI_File_read_shared(MPI_File, void *, int, MPI_Datatype, MPI_Status *); -int PMPI_File_write_shared(MPI_File, void *, int, MPI_Datatype, MPI_Status *); +int PMPI_File_read_shared(MPI_File, void *, int, MPI_Datatype, MPI_Status *) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); +int PMPI_File_write_shared(MPI_File, const void *, int, MPI_Datatype, MPI_Status *) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); int PMPI_File_iread_shared(MPI_File, void *, int, - MPI_Datatype, MPIO_Request *); -int PMPI_File_iwrite_shared(MPI_File, void *, int, - MPI_Datatype, MPIO_Request *); -int PMPI_File_read_ordered(MPI_File, void *, int, MPI_Datatype, MPI_Status *); -int PMPI_File_write_ordered(MPI_File, void *, int, MPI_Datatype, MPI_Status *); + MPI_Datatype, MPIO_Request *) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); +int PMPI_File_iwrite_shared(MPI_File, const void *, int, + MPI_Datatype, MPIO_Request *) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); +int PMPI_File_read_ordered(MPI_File, void *, int, MPI_Datatype, MPI_Status *) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); +int PMPI_File_write_ordered(MPI_File, const void *, int, MPI_Datatype, MPI_Status *) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); int PMPI_File_seek_shared(MPI_File, MPI_Offset, int); int PMPI_File_get_position_shared(MPI_File, MPI_Offset *); /* Section 9.4.5 */ int PMPI_File_read_at_all_begin(MPI_File, MPI_Offset, void *, - int, MPI_Datatype); + int, MPI_Datatype) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5); int PMPI_File_read_at_all_end(MPI_File, void *, MPI_Status *); -int PMPI_File_write_at_all_begin(MPI_File, MPI_Offset, void *, - int, MPI_Datatype); -int PMPI_File_write_at_all_end(MPI_File, void *, MPI_Status *); -int PMPI_File_read_all_begin(MPI_File, void *, int, MPI_Datatype); +int PMPI_File_write_at_all_begin(MPI_File, MPI_Offset, const void *, + int, MPI_Datatype) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5); +int PMPI_File_write_at_all_end(MPI_File, const void *, MPI_Status *); +int PMPI_File_read_all_begin(MPI_File, void *, int, MPI_Datatype) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); int PMPI_File_read_all_end(MPI_File, void *, MPI_Status *); -int PMPI_File_write_all_begin(MPI_File, void *, int, MPI_Datatype); -int PMPI_File_write_all_end(MPI_File, void *, MPI_Status *); -int PMPI_File_read_ordered_begin(MPI_File, void *, int, MPI_Datatype); +int PMPI_File_write_all_begin(MPI_File, const void *, int, MPI_Datatype) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); +int PMPI_File_write_all_end(MPI_File, const void *, MPI_Status *); +int PMPI_File_read_ordered_begin(MPI_File, void *, int, MPI_Datatype) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); int PMPI_File_read_ordered_end(MPI_File, void *, MPI_Status *); -int PMPI_File_write_ordered_begin(MPI_File, void *, int, MPI_Datatype); -int PMPI_File_write_ordered_end(MPI_File, void *, MPI_Status *); +int PMPI_File_write_ordered_begin(MPI_File, const void *, int, MPI_Datatype) + MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4); +int PMPI_File_write_ordered_end(MPI_File, const void *, MPI_Status *); /* Section 9.5.1 */ int PMPI_File_get_type_extent(MPI_File, MPI_Datatype, MPI_Aint *); /* Section 9.5.3 */ -int PMPI_Register_datarep(char *, +int PMPI_Register_datarep(const char *, MPI_Datarep_conversion_function *, MPI_Datarep_conversion_function *, MPI_Datarep_extent_function *, @@ -420,8 +466,8 @@ int PMPI_File_get_atomicity(MPI_File, int *); int PMPI_File_sync(MPI_File); /* Section 4.13.3 */ -#ifndef MPICH2 -/* MPICH2 provides these definitions */ +#ifndef MPICH +/* MPICH provides these definitions */ int PMPI_File_set_errhandler( MPI_File, MPI_Errhandler ); int PMPI_File_get_errhandler( MPI_File, MPI_Errhandler * ); #endif @@ -473,10 +519,10 @@ MPI_Fint PMPI_Info_c2f(MPI_Info); MPI_Info PMPI_Info_f2c(MPI_Fint); #endif +#endif /* Open MPI: We don't want any of the profiling layer */ + #if defined(__cplusplus) } #endif -#endif /* Open MPI: We don't want any of the profiling layer */ - #endif diff --git a/ompi/mca/io/romio/romio/mpi-io/Makefile.am b/ompi/mca/io/romio/romio/mpi-io/Makefile.am index 39bfc109c4..dfd94b12bf 100644 --- a/ompi/mca/io/romio/romio/mpi-io/Makefile.am +++ b/ompi/mca/io/romio/romio/mpi-io/Makefile.am @@ -23,8 +23,6 @@ include $(top_srcdir)/Makefile.options -SUBDIRS = glue/openmpi - # Intentionally do *not* include iotest.c and iowait.c. Since we're # using MPI_HAS_GREQUEST, ROMIO makes MPIO_Test and MPIO_Wait be just # plain vanilla [P]MPI_Test and [P]MPI_WAIT, which we already have diff --git a/ompi/mca/io/romio/romio/mpi-io/Makefile.mk b/ompi/mca/io/romio/romio/mpi-io/Makefile.mk new file mode 100644 index 0000000000..d23ac9c383 --- /dev/null +++ b/ompi/mca/io/romio/romio/mpi-io/Makefile.mk @@ -0,0 +1,102 @@ +## -*- Mode: Makefile; -*- +## vim: set ft=automake : +## +## (C) 2011 by Argonne National Laboratory. +## See COPYRIGHT in top-level directory. +## + +include $(top_srcdir)/mpi-io/glue/Makefile.mk +include $(top_srcdir)/mpi-io/fortran/Makefile.mk + +AM_CPPFLAGS += -I$(top_builddir)/mpi-io -I$(top_srcdir)/mpi-io +noinst_HEADERS += mpi-io/mpioimpl.h mpi-io/mpioprof.h + +romio_mpi_sources += \ + mpi-io/close.c \ + mpi-io/delete.c \ + mpi-io/fsync.c \ + mpi-io/get_amode.c \ + mpi-io/get_atom.c \ + mpi-io/get_bytoff.c \ + mpi-io/get_extent.c \ + mpi-io/get_group.c \ + mpi-io/get_info.c \ + mpi-io/get_posn.c \ + mpi-io/get_posn_sh.c \ + mpi-io/get_size.c \ + mpi-io/get_view.c \ + mpi-io/iread.c \ + mpi-io/iread_at.c \ + mpi-io/iread_sh.c \ + mpi-io/iwrite.c \ + mpi-io/iwrite_at.c \ + mpi-io/iwrite_sh.c \ + mpi-io/open.c \ + mpi-io/prealloc.c \ + mpi-io/rd_atallb.c \ + mpi-io/rd_atalle.c \ + mpi-io/read.c \ + mpi-io/read_all.c \ + mpi-io/read_allb.c \ + mpi-io/read_alle.c \ + mpi-io/read_at.c \ + mpi-io/read_atall.c \ + mpi-io/read_ord.c \ + mpi-io/read_ordb.c \ + mpi-io/read_orde.c \ + mpi-io/read_sh.c \ + mpi-io/register_datarep.c \ + mpi-io/seek.c \ + mpi-io/seek_sh.c \ + mpi-io/set_atom.c \ + mpi-io/set_info.c \ + mpi-io/set_size.c \ + mpi-io/set_view.c \ + mpi-io/wr_atallb.c \ + mpi-io/wr_atalle.c \ + mpi-io/write.c \ + mpi-io/write_all.c \ + mpi-io/write_allb.c \ + mpi-io/write_alle.c \ + mpi-io/write_at.c \ + mpi-io/write_atall.c \ + mpi-io/write_ord.c \ + mpi-io/write_ordb.c \ + mpi-io/write_orde.c \ + mpi-io/write_sh.c + + +# non-MPI/PMPI sources that will be included in libromio +romio_other_sources += \ + mpi-io/mpich_fileutil.c \ + mpi-io/mpir-mpioinit.c \ + mpi-io/mpiu_greq.c \ + mpi-io/mpiu_external32.c + +# helper variables for conditionally compiled sources +mpio_request_sources= \ + mpi-io/ioreq_c2f.c \ + mpi-io/ioreq_f2c.c \ + mpi-io/iotest.c \ + mpi-io/iotestall.c \ + mpi-io/iotestany.c \ + mpi-io/iotestsome.c \ + mpi-io/iowait.c \ + mpi-io/iowaitall.c \ + mpi-io/iowaitany.c \ + mpi-io/iowaitsome.c + +mpio_extra_sources = \ + mpi-io/get_errh.c \ + mpi-io/set_errh.c + +# not used in MPICH, we use generalized requests instead +if BUILD_MPIO_REQUEST +romio_other_sources += $(mpio_request_sources) +endif BUILD_MPIO_REQUEST + +# not used in MPICH +if BUILD_MPIO_ERRHAN +romio_other_sources += $(mpio_request_sources) +endif BUILD_MPIO_ERRHAN + diff --git a/ompi/mca/io/romio/romio/mpi-io/close.c b/ompi/mca/io/romio/romio/mpi-io/close.c index 0f31532ad2..73588e8d49 100644 --- a/ompi/mca/io/romio/romio/mpi-io/close.c +++ b/ompi/mca/io/romio/romio/mpi-io/close.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -31,39 +31,38 @@ Input Parameters: .N fortran @*/ -int MPI_File_close(MPI_File *mpi_fh) +int MPI_File_close(MPI_File *fh) { int error_code; - ADIO_File fh; + ADIO_File adio_fh; static char myname[] = "MPI_FILE_CLOSE"; #ifdef MPI_hpux int fl_xmpi; - HPMP_IO_WSTART(fl_xmpi, BLKMPIFILECLOSE, TRDTBLOCK, *fh); + HPMP_IO_WSTART(fl_xmpi, BLKMPIFILECLOSE, TRDTBLOCK, *adio_fh); #endif /* MPI_hpux */ MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(*mpi_fh); + adio_fh = MPIO_File_resolve(*fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); /* --END ERROR HANDLING-- */ - if (ADIO_Feature(fh, ADIO_SHARED_FP)) + if (ADIO_Feature(adio_fh, ADIO_SHARED_FP)) { - ADIOI_Free((fh)->shared_fp_fname); - /* need a barrier because the file containing the shared file - pointer is opened with COMM_SELF. We don't want it to be - deleted while others are still accessing it. */ - /* FIXME: It is wrong to use MPI_Barrier; the user could choose to - re-implement MPI_Barrier in an unexpected way. Either use - MPIR_Barrier_impl as in MPICH2 or PMPI_Barrier */ - MPI_Barrier((fh)->comm); - if ((fh)->shared_fp_fd != ADIO_FILE_NULL) { - MPI_File *mpi_fh_shared = &(fh->shared_fp_fd); - ADIO_Close((fh)->shared_fp_fd, &error_code); - MPIO_File_free(mpi_fh_shared); + ADIOI_Free((adio_fh)->shared_fp_fname); + /* POSIX semantics say a deleted file remains available until all + * processes close the file. But since when was NFS posix-compliant? + */ + if (!ADIO_Feature(adio_fh, ADIO_UNLINK_AFTER_CLOSE)) { + MPI_Barrier((adio_fh)->comm); + } + if ((adio_fh)->shared_fp_fd != ADIO_FILE_NULL) { + MPI_File *fh_shared = &(adio_fh->shared_fp_fd); + ADIO_Close((adio_fh)->shared_fp_fd, &error_code); + MPIO_File_free(fh_shared); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) goto fn_fail; /* --END ERROR HANDLING-- */ @@ -79,12 +78,12 @@ int MPI_File_close(MPI_File *mpi_fh) in routine mca_io_romio_file_close() */ #if 0 - error_code = PMPI_File_set_errhandler(*mpi_fh, MPI_ERRORS_RETURN); + error_code = PMPI_File_set_errhandler(*fh, MPI_ERRORS_RETURN); if (error_code != MPI_SUCCESS) goto fn_fail; #endif - ADIO_Close(fh, &error_code); - MPIO_File_free(mpi_fh); + ADIO_Close(adio_fh, &error_code); + MPIO_File_free(fh); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) goto fn_fail; /* --END ERROR HANDLING-- */ @@ -98,7 +97,7 @@ fn_exit: return error_code; fn_fail: /* --BEGIN ERROR HANDLING-- */ - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; /* --END ERROR HANDLING-- */ } diff --git a/ompi/mca/io/romio/romio/mpi-io/delete.c b/ompi/mca/io/romio/romio/mpi-io/delete.c index 225a21680d..bb15314b49 100644 --- a/ompi/mca/io/romio/romio/mpi-io/delete.c +++ b/ompi/mca/io/romio/romio/mpi-io/delete.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -32,7 +32,7 @@ Input Parameters: .N fortran @*/ -int MPI_File_delete(char *filename, MPI_Info info) +int MPI_File_delete(const char *filename, MPI_Info info) { int error_code, file_system; char *tmp; diff --git a/ompi/mca/io/romio/romio/mpi-io/file_c2f.c b/ompi/mca/io/romio/romio/mpi-io/file_c2f.c index 9a85e8e0a6..236cceb489 100644 --- a/ompi/mca/io/romio/romio/mpi-io/file_c2f.c +++ b/ompi/mca/io/romio/romio/mpi-io/file_c2f.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -33,7 +33,7 @@ Input Parameters: Return Value: Fortran file handle (integer) @*/ -MPI_Fint MPI_File_c2f(MPI_File mpi_fh) +MPI_Fint MPI_File_c2f(MPI_File fh) { - return MPIO_File_c2f(mpi_fh); + return MPIO_File_c2f(fh); } diff --git a/ompi/mca/io/romio/romio/mpi-io/file_f2c.c b/ompi/mca/io/romio/romio/mpi-io/file_f2c.c index d62a10c32b..68d89cc9eb 100644 --- a/ompi/mca/io/romio/romio/mpi-io/file_f2c.c +++ b/ompi/mca/io/romio/romio/mpi-io/file_f2c.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/Makefile.in b/ompi/mca/io/romio/romio/mpi-io/fortran/Makefile.in deleted file mode 100644 index dbce6f5186..0000000000 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/Makefile.in +++ /dev/null @@ -1,222 +0,0 @@ -CC = @CC@ -AR = @AR@ -RANLIB = @RANLIB@ -LIBNAME = @LIBNAME@ -srcdir = @srcdir@ -CC_SHL = @CC_SHL@ -SHLIBNAME = @SHLIBNAME@ - -INCLUDE_DIR = -I@MPI_INCLUDE_DIR@ -I../../include -I${srcdir}/../../adio/include -I../../adio/include -I${srcdir}/.. -CFLAGS = -DMPIO_FORTRAN_SRC @CFLAGS@ $(MPIOPROFILE) $(INCLUDE_DIR) - -top_builddir = @master_topbuild_dir@ -LIBTOOL = @LIBTOOL@ -C_COMPILE_SHL = $(CC_SHL) - -@VPATH@ - -MPIO_FOBJECTS = closef.o readf.o openf.o writef.o get_extentf.o \ - ireadf.o iwritef.o iotestf.o iowaitf.o seekf.o \ - deletef.o read_allf.o read_atf.o \ - read_atallf.o iread_atf.o iwrite_atf.o get_posnf.o \ - write_allf.o write_atf.o write_atallf.o get_bytofff.o \ - set_viewf.o get_viewf.o get_groupf.o get_amodef.o \ - fsyncf.o get_atomf.o set_atomf.o set_infof.o get_infof.o \ - set_sizef.o get_sizef.o preallocf.o \ - rd_atallbf.o rd_atallef.o read_allbf.o read_allef.o wr_atallbf.o \ - wr_atallef.o write_allbf.o write_allef.o \ - get_posn_shf.o iread_shf.o read_shf.o write_shf.o \ - iwrite_shf.o seek_shf.o read_ordf.o read_ordef.o write_ordbf.o \ - read_ordbf.o write_ordf.o write_ordef.o set_errhf.o get_errhf.o - -MPIO_TMP_PFOBJECTS = closef.p readf.p openf.p writef.p get_extentf.p \ - ireadf.p iwritef.p iotestf.p iowaitf.p seekf.p \ - deletef.p read_allf.p read_atf.p \ - read_atallf.p iread_atf.p iwrite_atf.p get_posnf.p \ - write_allf.p write_atf.p write_atallf.p get_bytofff.p \ - set_viewf.p get_viewf.p get_groupf.p get_amodef.p \ - fsyncf.p get_atomf.p set_atomf.p set_infof.p get_infof.p \ - set_sizef.p get_sizef.p preallocf.p \ - rd_atallbf.p rd_atallef.p read_allbf.p read_allef.p wr_atallbf.p \ - wr_atallef.p write_allbf.p write_allef.p \ - get_posn_shf.p iread_shf.p read_shf.p write_shf.p \ - iwrite_shf.p seek_shf.p read_ordf.p read_ordef.p write_ordbf.p \ - read_ordbf.p write_ordf.p write_ordef.p set_errhf.p get_errhf.p - -MPIO_REAL_PFOBJECTS = _closef.o _readf.o _openf.o _get_extentf.o \ - _writef.o _set_viewf.o _seekf.o _read_atf.o \ - _ireadf.o _iwritef.o _iotestf.o _iowaitf.o _get_posnf.o \ - _deletef.o _read_allf.o \ - _read_atallf.o _iread_atf.o _iwrite_atf.o _get_bytofff.o \ - _write_allf.o _write_atf.o _write_atallf.o _get_viewf.o \ - _get_groupf.o _get_amodef.o _fsyncf.o _get_atomf.o _set_atomf.o \ - _set_sizef.o _get_sizef.o _preallocf.o _set_infof.o _get_infof.o \ - _rd_atallbf.o _rd_atallef.o _read_allbf.o _read_allef.o _wr_atallbf.o \ - _wr_atallef.o _write_allbf.o _write_allef.o \ - _get_posn_shf.o _iread_shf.o _read_shf.o _write_shf.o \ - _iwrite_shf.o _seek_shf.o _read_ordf.o _read_ordef.o _write_ordbf.o \ - _read_ordbf.o _write_ordf.o _write_ordef.o _set_errhf.o _get_errhf.o - -all: $(LIBNAME) - @if [ "@ENABLE_SHLIB@" != "none" ] ; then \ - $(MAKE) $(SHLIBNAME).la ;\ - fi - -.SUFFIXES: $(SUFFIXES) .p .sp .lo - -.c.o: - $(CC) $(CFLAGS) -c $< - -.c.lo: - $(C_COMPILE_SHL) $(CFLAGS) -c $< -o _s$*.o - @mv -f _s$*.o $*.lo - -.c.p: - @cp $(srcdir)/$*.c _$*.c - $(CC) $(CFLAGS) -c _$*.c - @rm -f _$*.c - -.c.sp: - $(C_COMPILE_SHL) $(CFLAGS) -c $< -o _$*.lo - -profile: $(MPIO_TMP_PFOBJECTS) - $(AR) $(LIBNAME) $(MPIO_REAL_PFOBJECTS) - $(RANLIB) $(LIBNAME) - @if [ "@ENABLE_SHLIB@" != "none" ] ; then \ - $(MAKE) P$(SHLIBNAME).la ;\ - fi - @rm -f _*.o - -$(LIBNAME): $(MPIO_FOBJECTS) - $(AR) $(LIBNAME) $(MPIO_FOBJECTS) - $(RANLIB) $(LIBNAME) - -MPIO_LOFOBJECTS = $(MPIO_FOBJECTS:.o=.lo) -$(SHLIBNAME).la: $(MPIO_LOFOBJECTS) - $(AR) $(SHLIBNAME).la $(MPIO_LOFOBJECTS) - -# -------------------------------------------------------------------------- -# We use P$(SHLBNAME) simply to distinguish the regular lib build from the -# profiling library build -MPIO_LOPFOBJECTS = $(MPIO_REAL_PFOBJECTS:.o=.lo) -MPIO_TMP_LOPFOBJECTS = ${MPIO_TMP_PFOBJECTS:.p=.sp} -P$(SHLIBNAME).la: $(MPIO_TMP_LOPFOBJECTS) - $(AR) $(SHLIBNAME).la $(MPIO_LOPFOBJECTS) -# -------------------------------------------------------------------------- - -clean: - @rm -f *.o *.lo *.gcno *.gcda *.bb *.bbg - @rm -f ${srcdir}/*.gcno ${srcdir}/*.gcda - @rm -f ${srcdir}/*.bb ${srcdir}/*.bbg - -# Rules for the profiling objects -_closef.o: closef.c - $(CC) $(CFLAGS) -c $(srcdir)/closef.c -o _closef.o -_readf.o: readf.c - $(CC) $(CFLAGS) -c $(srcdir)/readf.c -o _readf.o -_openf.o: openf.c - $(CC) $(CFLAGS) -c $(srcdir)/openf.c -o _openf.o -_get_extentf.o: get_extentf.c - $(CC) $(CFLAGS) -c $(srcdir)/get_extentf.c -o _get_extentf.o -_writef.o: writef.c - $(CC) $(CFLAGS) -c $(srcdir)/writef.c -o _writef.o -_set_viewf.o: set_viewf.c - $(CC) $(CFLAGS) -c $(srcdir)/set_viewf.c -o _set_viewf.o -_seekf.o: seekf.c - $(CC) $(CFLAGS) -c $(srcdir)/seekf.c -o _seekf.o -_read_atf.o: read_atf.c - $(CC) $(CFLAGS) -c $(srcdir)/read_atf.c -o _read_atf.o -_ireadf.o: ireadf.c - $(CC) $(CFLAGS) -c $(srcdir)/ireadf.c -o _ireadf.o -_iwritef.o: iwritef.c - $(CC) $(CFLAGS) -c $(srcdir)/iwritef.c -o _iwritef.o -_iotestf.o: iotestf.c - $(CC) $(CFLAGS) -c $(srcdir)/iotestf.c -o _iotestf.o -_iowaitf.o: iowaitf.c - $(CC) $(CFLAGS) -c $(srcdir)/iowaitf.c -o _iowaitf.o -_get_posnf.o: get_posnf.c - $(CC) $(CFLAGS) -c $(srcdir)/get_posnf.c -o _get_posnf.o -_deletef.o: deletef.c - $(CC) $(CFLAGS) -c $(srcdir)/deletef.c -o _deletef.o -_read_allf.o: read_allf.c - $(CC) $(CFLAGS) -c $(srcdir)/read_allf.c -o _read_allf.o -_read_atallf.o: read_atallf.c - $(CC) $(CFLAGS) -c $(srcdir)/read_atallf.c -o _read_atallf.o -_iread_atf.o: iread_atf.c - $(CC) $(CFLAGS) -c $(srcdir)/iread_atf.c -o _iread_atf.o -_iwrite_atf.o: iwrite_atf.c - $(CC) $(CFLAGS) -c $(srcdir)/iwrite_atf.c -o _iwrite_atf.o -_get_bytofff.o: get_bytofff.c - $(CC) $(CFLAGS) -c $(srcdir)/get_bytofff.c -o _get_bytofff.o -_write_allf.o: write_allf.c - $(CC) $(CFLAGS) -c $(srcdir)/write_allf.c -o _write_allf.o -_write_atf.o: write_atf.c - $(CC) $(CFLAGS) -c $(srcdir)/write_atf.c -o _write_atf.o -_write_atallf.o: write_atallf.c - $(CC) $(CFLAGS) -c $(srcdir)/write_atallf.c -o _write_atallf.o -_get_viewf.o: get_viewf.c - $(CC) $(CFLAGS) -c $(srcdir)/get_viewf.c -o _get_viewf.o -_get_groupf.o: get_groupf.c - $(CC) $(CFLAGS) -c $(srcdir)/get_groupf.c -o _get_groupf.o -_get_amodef.o: get_amodef.c - $(CC) $(CFLAGS) -c $(srcdir)/get_amodef.c -o _get_amodef.o -_fsyncf.o: fsyncf.c - $(CC) $(CFLAGS) -c $(srcdir)/fsyncf.c -o _fsyncf.o -_get_atomf.o: get_atomf.c - $(CC) $(CFLAGS) -c $(srcdir)/get_atomf.c -o _get_atomf.o -_set_atomf.o: set_atomf.c - $(CC) $(CFLAGS) -c $(srcdir)/set_atomf.c -o _set_atomf.o -_set_sizef.o: set_sizef.c - $(CC) $(CFLAGS) -c $(srcdir)/set_sizef.c -o _set_sizef.o -_get_sizef.o: get_sizef.c - $(CC) $(CFLAGS) -c $(srcdir)/get_sizef.c -o _get_sizef.o -_preallocf.o: preallocf.c - $(CC) $(CFLAGS) -c $(srcdir)/preallocf.c -o _preallocf.o -_set_infof.o: set_infof.c - $(CC) $(CFLAGS) -c $(srcdir)/set_infof.c -o _set_infof.o -_get_infof.o: get_infof.c - $(CC) $(CFLAGS) -c $(srcdir)/get_infof.c -o _get_infof.o -_rd_atallbf.o: rd_atallbf.c - $(CC) $(CFLAGS) -c $(srcdir)/rd_atallbf.c -o _rd_atallbf.o -_rd_atallef.o: rd_atallef.c - $(CC) $(CFLAGS) -c $(srcdir)/rd_atallef.c -o _rd_atallef.o -_read_allbf.o: read_allbf.c - $(CC) $(CFLAGS) -c $(srcdir)/read_allbf.c -o _read_allbf.o -_read_allef.o: read_allef.c - $(CC) $(CFLAGS) -c $(srcdir)/read_allef.c -o _read_allef.o -_wr_atallbf.o: wr_atallbf.c - $(CC) $(CFLAGS) -c $(srcdir)/wr_atallbf.c -o _wr_atallbf.o -_wr_atallef.o: wr_atallef.c - $(CC) $(CFLAGS) -c $(srcdir)/wr_atallef.c -o _wr_atallef.o -_write_allbf.o: write_allbf.c - $(CC) $(CFLAGS) -c $(srcdir)/write_allbf.c -o _write_allbf.o -_write_allef.o: write_allef.c - $(CC) $(CFLAGS) -c $(srcdir)/write_allef.c -o _write_allef.o -_get_posn_shf.o: get_posn_shf.c - $(CC) $(CFLAGS) -c $(srcdir)/get_posn_shf.c -o _get_posn_shf.o -_iread_shf.o: iread_shf.c - $(CC) $(CFLAGS) -c $(srcdir)/iread_shf.c -o _iread_shf.o -_read_shf.o: read_shf.c - $(CC) $(CFLAGS) -c $(srcdir)/read_shf.c -o _read_shf.o -_write_shf.o: write_shf.c - $(CC) $(CFLAGS) -c $(srcdir)/write_shf.c -o _write_shf.o -_iwrite_shf.o: iwrite_shf.c - $(CC) $(CFLAGS) -c $(srcdir)/iwrite_shf.c -o _iwrite_shf.o -_seek_shf.o: seek_shf.c - $(CC) $(CFLAGS) -c $(srcdir)/seek_shf.c -o _seek_shf.o -_read_ordf.o: read_ordf.c - $(CC) $(CFLAGS) -c $(srcdir)/read_ordf.c -o _read_ordf.o -_read_ordef.o: read_ordef.c - $(CC) $(CFLAGS) -c $(srcdir)/read_ordef.c -o _read_ordef.o -_write_ordbf.o: write_ordbf.c - $(CC) $(CFLAGS) -c $(srcdir)/write_ordbf.c -o _write_ordbf.o -_read_ordbf.o: read_ordbf.c - $(CC) $(CFLAGS) -c $(srcdir)/read_ordbf.c -o _read_ordbf.o -_write_ordf.o: write_ordf.c - $(CC) $(CFLAGS) -c $(srcdir)/write_ordf.c -o _write_ordf.o -_write_ordef.o: write_ordef.c - $(CC) $(CFLAGS) -c $(srcdir)/write_ordef.c -o _write_ordef.o -_set_errhf.o: set_errhf.c - $(CC) $(CFLAGS) -c $(srcdir)/set_errhf.c -o _set_errhf.o -_get_errhf.o: get_errhf.c - $(CC) $(CFLAGS) -c $(srcdir)/get_errhf.c -o _get_errhf.o diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/Makefile.mk b/ompi/mca/io/romio/romio/mpi-io/fortran/Makefile.mk new file mode 100644 index 0000000000..f7ed72b69b --- /dev/null +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/Makefile.mk @@ -0,0 +1,68 @@ +## -*- Mode: Makefile; -*- +## vim: set ft=automake : +## +## (C) 2011 by Argonne National Laboratory. +## See COPYRIGHT in top-level directory. +## + +if BUILD_F77_BINDINGS + +romio_mpi_sources += \ + mpi-io/fortran/closef.c \ + mpi-io/fortran/deletef.c \ + mpi-io/fortran/fsyncf.c \ + mpi-io/fortran/get_amodef.c \ + mpi-io/fortran/get_atomf.c \ + mpi-io/fortran/get_bytofff.c \ + mpi-io/fortran/get_errhf.c \ + mpi-io/fortran/get_extentf.c \ + mpi-io/fortran/get_groupf.c \ + mpi-io/fortran/get_infof.c \ + mpi-io/fortran/get_posn_shf.c \ + mpi-io/fortran/get_posnf.c \ + mpi-io/fortran/get_sizef.c \ + mpi-io/fortran/get_viewf.c \ + mpi-io/fortran/iotestf.c \ + mpi-io/fortran/iowaitf.c \ + mpi-io/fortran/iread_atf.c \ + mpi-io/fortran/iread_shf.c \ + mpi-io/fortran/ireadf.c \ + mpi-io/fortran/iwrite_atf.c \ + mpi-io/fortran/iwrite_shf.c \ + mpi-io/fortran/iwritef.c \ + mpi-io/fortran/openf.c \ + mpi-io/fortran/preallocf.c \ + mpi-io/fortran/rd_atallbf.c \ + mpi-io/fortran/rd_atallef.c \ + mpi-io/fortran/read_allbf.c \ + mpi-io/fortran/read_allef.c \ + mpi-io/fortran/read_allf.c \ + mpi-io/fortran/read_atallf.c \ + mpi-io/fortran/read_atf.c \ + mpi-io/fortran/read_ordbf.c \ + mpi-io/fortran/read_ordef.c \ + mpi-io/fortran/read_ordf.c \ + mpi-io/fortran/read_shf.c \ + mpi-io/fortran/readf.c \ + mpi-io/fortran/seek_shf.c \ + mpi-io/fortran/seekf.c \ + mpi-io/fortran/set_atomf.c \ + mpi-io/fortran/set_errhf.c \ + mpi-io/fortran/set_infof.c \ + mpi-io/fortran/set_sizef.c \ + mpi-io/fortran/set_viewf.c \ + mpi-io/fortran/wr_atallbf.c \ + mpi-io/fortran/wr_atallef.c \ + mpi-io/fortran/write_allbf.c \ + mpi-io/fortran/write_allef.c \ + mpi-io/fortran/write_allf.c \ + mpi-io/fortran/write_atallf.c \ + mpi-io/fortran/write_atf.c \ + mpi-io/fortran/write_ordbf.c \ + mpi-io/fortran/write_ordef.c \ + mpi-io/fortran/write_ordf.c \ + mpi-io/fortran/write_shf.c \ + mpi-io/fortran/writef.c + +endif BUILD_F77_BINDINGS + diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/closef.c b/ompi/mca/io/romio/romio/mpi-io/fortran/closef.c index 76a2c7bb1a..aebdf56a61 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/closef.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/closef.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/deletef.c b/ompi/mca/io/romio/romio/mpi-io/fortran/deletef.c index 08953a297f..660129f760 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/deletef.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/deletef.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/fsyncf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/fsyncf.c index 599ed41e30..b52245256b 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/fsyncf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/fsyncf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/get_amodef.c b/ompi/mca/io/romio/romio/mpi-io/fortran/get_amodef.c index 20e50f8f6d..2427f06831 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/get_amodef.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/get_amodef.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/get_atomf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/get_atomf.c index 103da73b43..98bf557e34 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/get_atomf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/get_atomf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/get_bytofff.c b/ompi/mca/io/romio/romio/mpi-io/fortran/get_bytofff.c index 0fe26f1a3b..fb38b7be4c 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/get_bytofff.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/get_bytofff.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/get_errhf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/get_errhf.c index c133a10fc2..96901ad776 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/get_errhf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/get_errhf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/get_extentf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/get_extentf.c index a62a959acf..9a11d3c946 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/get_extentf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/get_extentf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/get_groupf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/get_groupf.c index 11c39b5326..bb8c9a9cba 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/get_groupf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/get_groupf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/get_infof.c b/ompi/mca/io/romio/romio/mpi-io/fortran/get_infof.c index e00f9c49bc..eb2ba551a4 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/get_infof.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/get_infof.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/get_posn_shf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/get_posn_shf.c index 12137df951..8f5bff5c06 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/get_posn_shf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/get_posn_shf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/get_posnf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/get_posnf.c index 6b6eeb5cdb..e21f37674a 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/get_posnf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/get_posnf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/get_sizef.c b/ompi/mca/io/romio/romio/mpi-io/fortran/get_sizef.c index 01e45afbc4..71ff17bb56 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/get_sizef.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/get_sizef.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/get_viewf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/get_viewf.c index b011b612f4..8a4bc3d7fb 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/get_viewf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/get_viewf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -150,6 +150,8 @@ FORTRAN_API void FORT_CALL mpi_file_get_view_( MPI_Fint *fh, MPI_Offset *disp, M #endif MPI_File fh_c; int i, tmpreplen; + MPI_Datatype etype_c, filetype_c; + char *tmprep; /* Initialize the string to all blanks */ @@ -160,7 +162,9 @@ FORTRAN_API void FORT_CALL mpi_file_get_view_( MPI_Fint *fh, MPI_Offset *disp, M tmprep = (char *) ADIOI_Malloc((MPI_MAX_DATAREP_STRING+1) * sizeof(char)); fh_c = MPI_File_f2c(*fh); - *ierr = MPI_File_get_view(fh_c, disp, etype, filetype, tmprep); + etype_c = MPI_Type_f2c(*etype); + filetype_c = MPI_Type_f2c(*filetype); + *ierr = MPI_File_get_view(fh_c, disp, &etype_c, &filetype_c, tmprep); tmpreplen = strlen(tmprep); if (tmpreplen <= str_len) { @@ -176,6 +180,8 @@ FORTRAN_API void FORT_CALL mpi_file_get_view_( MPI_Fint *fh, MPI_Offset *disp, M *ierr = MPI_ERR_UNKNOWN; } + *etype = MPI_Type_c2f(etype_c); + *filetype = MPI_Type_c2f(filetype_c); ADIOI_Free(tmprep); } #endif diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/iotestf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/iotestf.c index db6bf92c7b..2a2c96c886 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/iotestf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/iotestf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/iowaitf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/iowaitf.c index beb8ce73d6..a87ca6a6d9 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/iowaitf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/iowaitf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/iread_atf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/iread_atf.c index d81d49f467..c6a687dcee 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/iread_atf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/iread_atf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/iread_shf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/iread_shf.c index 0c07d52337..84dc3753c4 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/iread_shf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/iread_shf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/ireadf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/ireadf.c index 10c7e4088a..ae9fbaf3bf 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/ireadf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/ireadf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/iwrite_atf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/iwrite_atf.c index 0dedd472ea..b326fc3d1a 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/iwrite_atf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/iwrite_atf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/iwrite_shf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/iwrite_shf.c index f44cf568f4..90ea68777b 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/iwrite_shf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/iwrite_shf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/iwritef.c b/ompi/mca/io/romio/romio/mpi-io/fortran/iwritef.c index 7288b0fbc3..4410c011a1 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/iwritef.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/iwritef.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/openf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/openf.c index 4c98389a8c..ea1a5d1c47 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/openf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/openf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/preallocf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/preallocf.c index e2826cc608..515aa4a912 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/preallocf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/preallocf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/rd_atallbf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/rd_atallbf.c index bace7fc00c..5fff4e9e7e 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/rd_atallbf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/rd_atallbf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/rd_atallef.c b/ompi/mca/io/romio/romio/mpi-io/fortran/rd_atallef.c index f6c0d8c8f5..8a3441126d 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/rd_atallef.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/rd_atallef.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/read_allbf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/read_allbf.c index 84c6db6387..5708a03c8d 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/read_allbf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/read_allbf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/read_allef.c b/ompi/mca/io/romio/romio/mpi-io/fortran/read_allef.c index 40e4c670cf..776b182d64 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/read_allef.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/read_allef.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/read_allf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/read_allf.c index 29c0b690b2..99e1229b7f 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/read_allf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/read_allf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/read_atallf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/read_atallf.c index 6a00ccac91..b9f30a0056 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/read_atallf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/read_atallf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/read_atf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/read_atf.c index 99e430099d..2602e399bf 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/read_atf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/read_atf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/read_ordbf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/read_ordbf.c index ce9c7647b2..74389174f4 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/read_ordbf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/read_ordbf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/read_ordef.c b/ompi/mca/io/romio/romio/mpi-io/fortran/read_ordef.c index 0b1acf78bf..63425c8ad3 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/read_ordef.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/read_ordef.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/read_ordf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/read_ordf.c index 11a2c8809a..a45ae1282f 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/read_ordf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/read_ordf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/read_shf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/read_shf.c index a96aca6953..937e54fb95 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/read_shf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/read_shf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/readf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/readf.c index c0d1aa1d69..c802739139 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/readf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/readf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/seek_shf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/seek_shf.c index 2d55da6cba..158e626c0e 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/seek_shf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/seek_shf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/seekf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/seekf.c index cd6620645d..8e125d1849 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/seekf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/seekf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/set_atomf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/set_atomf.c index 26a80430ff..c4388950da 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/set_atomf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/set_atomf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/set_errhf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/set_errhf.c index b7b7d25d9d..c622660898 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/set_errhf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/set_errhf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/set_infof.c b/ompi/mca/io/romio/romio/mpi-io/fortran/set_infof.c index 604651ea68..85c05e8f1d 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/set_infof.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/set_infof.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/set_sizef.c b/ompi/mca/io/romio/romio/mpi-io/fortran/set_sizef.c index 509b01f0ec..c595f2b855 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/set_sizef.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/set_sizef.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/set_viewf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/set_viewf.c index becd2c7ffc..97151d978f 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/set_viewf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/set_viewf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/wr_atallbf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/wr_atallbf.c index 15dba1d271..836dd378ae 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/wr_atallbf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/wr_atallbf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/wr_atallef.c b/ompi/mca/io/romio/romio/mpi-io/fortran/wr_atallef.c index 7cd6743cab..7426c48bf2 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/wr_atallef.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/wr_atallef.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/write_allbf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/write_allbf.c index 7a5a512e4f..e47d3cd200 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/write_allbf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/write_allbf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/write_allef.c b/ompi/mca/io/romio/romio/mpi-io/fortran/write_allef.c index 9177c1fe76..9ccc1eb8db 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/write_allef.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/write_allef.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/write_allf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/write_allf.c index 94c03074af..bddcac1509 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/write_allf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/write_allf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/write_atallf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/write_atallf.c index 4cd6ca55a0..030e7ae359 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/write_atallf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/write_atallf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/write_atf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/write_atf.c index 8eda725f68..8ba429dcc6 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/write_atf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/write_atf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/write_ordbf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/write_ordbf.c index a4d6a844f9..41b9accfbe 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/write_ordbf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/write_ordbf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/write_ordef.c b/ompi/mca/io/romio/romio/mpi-io/fortran/write_ordef.c index d7e5ea5908..a979f70eee 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/write_ordef.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/write_ordef.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/write_ordf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/write_ordf.c index 25b1bf42e4..fe96406d9b 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/write_ordf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/write_ordf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/write_shf.c b/ompi/mca/io/romio/romio/mpi-io/fortran/write_shf.c index c4575d9dda..30d80e0ee6 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/write_shf.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/write_shf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fortran/writef.c b/ompi/mca/io/romio/romio/mpi-io/fortran/writef.c index ddacd6273a..9b07ba095f 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fortran/writef.c +++ b/ompi/mca/io/romio/romio/mpi-io/fortran/writef.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/fsync.c b/ompi/mca/io/romio/romio/mpi-io/fsync.c index a26c4ee70c..0e55ab3c82 100644 --- a/ompi/mca/io/romio/romio/mpi-io/fsync.c +++ b/ompi/mca/io/romio/romio/mpi-io/fsync.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -32,22 +32,22 @@ Input Parameters: .N fortran @*/ -int MPI_File_sync(MPI_File mpi_fh) +int MPI_File_sync(MPI_File fh) { int error_code; - ADIO_File fh; + ADIO_File adio_fh; static char myname[] = "MPI_FILE_SYNC"; #ifdef MPI_hpux int fl_xmpi; - HPMP_IO_START(fl_xmpi, BLKMPIFILESYNC, TRDTBLOCK, fh, + HPMP_IO_START(fl_xmpi, BLKMPIFILESYNC, TRDTBLOCK, adio_fh, MPI_DATATYPE_NULL, -1); #endif /* MPI_hpux */ MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - if ((fh <= (MPI_File) 0) || ((fh)->cookie != ADIOI_FILE_COOKIE)) + if ((adio_fh <= (MPI_File) 0) || ((adio_fh)->cookie != ADIOI_FILE_COOKIE)) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, @@ -55,18 +55,19 @@ int MPI_File_sync(MPI_File mpi_fh) error_code = MPIO_Err_return_file(MPI_FILE_NULL, error_code); goto fn_exit; } + MPIO_CHECK_WRITABLE(fh, myname, error_code); /* --END ERROR HANDLING-- */ - ADIOI_TEST_DEFERRED(fh, "MPI_File_sync", &error_code); + ADIOI_TEST_DEFERRED(adio_fh, "MPI_File_sync", &error_code); - ADIO_Flush(fh, &error_code); + ADIO_Flush(adio_fh, &error_code); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); /* --END ERROR HANDLING-- */ #ifdef MPI_hpux - HPMP_IO_END(fl_xmpi, fh, MPI_DATATYPE_NULL, -1); + HPMP_IO_END(fl_xmpi, adio_fh, MPI_DATATYPE_NULL, -1); #endif /* MPI_hpux */ fn_exit: diff --git a/ompi/mca/io/romio/romio/mpi-io/get_amode.c b/ompi/mca/io/romio/romio/mpi-io/get_amode.c index dbe4374482..395b034027 100644 --- a/ompi/mca/io/romio/romio/mpi-io/get_amode.c +++ b/ompi/mca/io/romio/romio/mpi-io/get_amode.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -34,19 +34,19 @@ Output Parameters: .N fortran @*/ -int MPI_File_get_amode(MPI_File mpi_fh, int *amode) +int MPI_File_get_amode(MPI_File fh, int *amode) { int error_code=MPI_SUCCESS; static char myname[] = "MPI_FILE_GET_AMODE"; - ADIO_File fh; + ADIO_File adio_fh; - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); /* --END ERROR HANDLING-- */ - *amode = fh->access_mode; + *amode = adio_fh->access_mode; fn_exit: return error_code; diff --git a/ompi/mca/io/romio/romio/mpi-io/get_atom.c b/ompi/mca/io/romio/romio/mpi-io/get_atom.c index 946cae7a39..37d2f8df81 100644 --- a/ompi/mca/io/romio/romio/mpi-io/get_atom.c +++ b/ompi/mca/io/romio/romio/mpi-io/get_atom.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -34,19 +34,19 @@ Output Parameters: .N fortran @*/ -int MPI_File_get_atomicity(MPI_File mpi_fh, int *flag) +int MPI_File_get_atomicity(MPI_File fh, int *flag) { int error_code; - ADIO_File fh; + ADIO_File adio_fh; static char myname[] = "MPI_FILE_GET_ATOMICITY"; - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); /* --END ERROR HANDLING-- */ - *flag = fh->atomicity; + *flag = adio_fh->atomicity; fn_exit: return MPI_SUCCESS; diff --git a/ompi/mca/io/romio/romio/mpi-io/get_bytoff.c b/ompi/mca/io/romio/romio/mpi-io/get_bytoff.c index c1e982442d..7c95ed83ce 100644 --- a/ompi/mca/io/romio/romio/mpi-io/get_bytoff.c +++ b/ompi/mca/io/romio/romio/mpi-io/get_bytoff.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -38,32 +38,30 @@ Output Parameters: .N fortran @*/ -int MPI_File_get_byte_offset(MPI_File mpi_fh, - MPI_Offset offset, - MPI_Offset *disp) +int MPI_File_get_byte_offset(MPI_File fh, MPI_Offset offset, MPI_Offset *disp) { int error_code; - ADIO_File fh; + ADIO_File adio_fh; static char myname[] = "MPI_FILE_GET_BYTE_OFFSET"; - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); if (offset < 0) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**iobadoffset", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } - MPIO_CHECK_NOT_SEQUENTIAL_MODE(fh, myname, error_code); + MPIO_CHECK_NOT_SEQUENTIAL_MODE(adio_fh, myname, error_code); /* --END ERROR HANDLING-- */ - ADIOI_Get_byte_offset(fh, offset, disp); + ADIOI_Get_byte_offset(adio_fh, offset, disp); fn_exit: diff --git a/ompi/mca/io/romio/romio/mpi-io/get_errh.c b/ompi/mca/io/romio/romio/mpi-io/get_errh.c index bf4b08e7f0..80ee428c28 100644 --- a/ompi/mca/io/romio/romio/mpi-io/get_errh.c +++ b/ompi/mca/io/romio/romio/mpi-io/get_errh.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/get_extent.c b/ompi/mca/io/romio/romio/mpi-io/get_extent.c index bb886bdc76..60dcd5753b 100644 --- a/ompi/mca/io/romio/romio/mpi-io/get_extent.c +++ b/ompi/mca/io/romio/romio/mpi-io/get_extent.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -35,18 +35,17 @@ Output Parameters: .N fortran @*/ -int MPI_File_get_type_extent(MPI_File mpi_fh, MPI_Datatype datatype, - MPI_Aint *extent) +int MPI_File_get_type_extent(MPI_File fh, MPI_Datatype datatype, MPI_Aint *extent) { int error_code; - ADIO_File fh; + ADIO_File adio_fh; static char myname[] = "MPI_FILE_GET_TYPE_EXTENT"; - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); - MPIO_CHECK_DATATYPE(fh, datatype, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); + MPIO_CHECK_DATATYPE(adio_fh, datatype, myname, error_code); /* --END ERROR HANDLING-- */ /* FIXME: handle other file data representations */ diff --git a/ompi/mca/io/romio/romio/mpi-io/get_group.c b/ompi/mca/io/romio/romio/mpi-io/get_group.c index 747318f49b..dbc6e8df66 100644 --- a/ompi/mca/io/romio/romio/mpi-io/get_group.c +++ b/ompi/mca/io/romio/romio/mpi-io/get_group.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -35,18 +35,18 @@ Output Parameters: .N fortran @*/ -int MPI_File_get_group(MPI_File mpi_fh, MPI_Group *group) +int MPI_File_get_group(MPI_File fh, MPI_Group *group) { int error_code; - ADIO_File fh; + ADIO_File adio_fh; static char myname[] = "MPI_FILE_GET_GROUP"; MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); /* --END ERROR HANDLING-- */ @@ -54,7 +54,7 @@ int MPI_File_get_group(MPI_File mpi_fh, MPI_Group *group) * with deferred open this might not be the group of processes that * actually opened the file from the file system's perspective */ - error_code = MPI_Comm_group(fh->comm, group); + error_code = MPI_Comm_group(adio_fh->comm, group); fn_exit: MPIU_THREAD_CS_EXIT(ALLFUNC,); diff --git a/ompi/mca/io/romio/romio/mpi-io/get_info.c b/ompi/mca/io/romio/romio/mpi-io/get_info.c index 96b16a12e5..334cd580a1 100644 --- a/ompi/mca/io/romio/romio/mpi-io/get_info.c +++ b/ompi/mca/io/romio/romio/mpi-io/get_info.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -34,24 +34,24 @@ Output Parameters: .N fortran @*/ -int MPI_File_get_info(MPI_File mpi_fh, MPI_Info *info_used) +int MPI_File_get_info(MPI_File fh, MPI_Info *info_used) { int error_code; - ADIO_File fh; + ADIO_File adio_fh; static char myname[] = "MPI_FILE_GET_INFO"; MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); /* --END ERROR HANDLING-- */ - error_code = MPI_Info_dup(fh->info, info_used); + error_code = MPI_Info_dup(adio_fh->info, info_used); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); /* --END ERROR HANDLING-- */ fn_exit: diff --git a/ompi/mca/io/romio/romio/mpi-io/get_posn.c b/ompi/mca/io/romio/romio/mpi-io/get_posn.c index 37c7fd0ad6..0c7a54fc61 100644 --- a/ompi/mca/io/romio/romio/mpi-io/get_posn.c +++ b/ompi/mca/io/romio/romio/mpi-io/get_posn.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -37,20 +37,20 @@ Output Parameters: .N fortran @*/ -int MPI_File_get_position(MPI_File mpi_fh, MPI_Offset *offset) +int MPI_File_get_position(MPI_File fh, MPI_Offset *offset) { int error_code; - ADIO_File fh; + ADIO_File adio_fh; static char myname[] = "MPI_FILE_GET_POSITION"; - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); - MPIO_CHECK_NOT_SEQUENTIAL_MODE(fh, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); + MPIO_CHECK_NOT_SEQUENTIAL_MODE(adio_fh, myname, error_code); /* --END ERROR HANDLING-- */ - ADIOI_Get_position(fh, offset); + ADIOI_Get_position(adio_fh, offset); fn_exit: return MPI_SUCCESS; diff --git a/ompi/mca/io/romio/romio/mpi-io/get_posn_sh.c b/ompi/mca/io/romio/romio/mpi-io/get_posn_sh.c index 873f5c4e19..051ea65514 100644 --- a/ompi/mca/io/romio/romio/mpi-io/get_posn_sh.c +++ b/ompi/mca/io/romio/romio/mpi-io/get_posn_sh.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -35,26 +35,26 @@ Output Parameters: .N fortran @*/ -int MPI_File_get_position_shared(MPI_File mpi_fh, MPI_Offset *offset) +int MPI_File_get_position_shared(MPI_File fh, MPI_Offset *offset) { int error_code; - ADIO_File fh; + ADIO_File adio_fh; static char myname[] = "MPI_FILE_GET_POSITION_SHARED"; - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); - MPIO_CHECK_NOT_SEQUENTIAL_MODE(fh, myname, error_code); - MPIO_CHECK_FS_SUPPORTS_SHARED(fh, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); + MPIO_CHECK_NOT_SEQUENTIAL_MODE(adio_fh, myname, error_code); + MPIO_CHECK_FS_SUPPORTS_SHARED(adio_fh, myname, error_code); /* --END ERROR HANDLING-- */ - ADIOI_TEST_DEFERRED(fh, myname, &error_code); + ADIOI_TEST_DEFERRED(adio_fh, myname, &error_code); - ADIO_Get_shared_fp(fh, 0, offset, &error_code); + ADIO_Get_shared_fp(adio_fh, 0, offset, &error_code); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); /* --END ERROR HANDLING-- */ fn_exit: diff --git a/ompi/mca/io/romio/romio/mpi-io/get_size.c b/ompi/mca/io/romio/romio/mpi-io/get_size.c index a23d2c9197..f3150de0e6 100644 --- a/ompi/mca/io/romio/romio/mpi-io/get_size.c +++ b/ompi/mca/io/romio/romio/mpi-io/get_size.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -34,38 +34,38 @@ Output Parameters: .N fortran @*/ -int MPI_File_get_size(MPI_File mpi_fh, MPI_Offset *size) +int MPI_File_get_size(MPI_File fh, MPI_Offset *size) { int error_code; - ADIO_File fh; + ADIO_File adio_fh; ADIO_Fcntl_t *fcntl_struct; static char myname[] = "MPI_FILE_GET_SIZE"; #ifdef MPI_hpux int fl_xmpi; - HPMP_IO_START(fl_xmpi, BLKMPIFILEGETSIZE, TRDTBLOCK, fh, + HPMP_IO_START(fl_xmpi, BLKMPIFILEGETSIZE, TRDTBLOCK, adio_fh, MPI_DATATYPE_NULL, -1); #endif /* MPI_hpux */ - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); /* --END ERROR HANDLING-- */ - ADIOI_TEST_DEFERRED(fh, myname, &error_code); + ADIOI_TEST_DEFERRED(adio_fh, myname, &error_code); fcntl_struct = (ADIO_Fcntl_t *) ADIOI_Malloc(sizeof(ADIO_Fcntl_t)); - ADIO_Fcntl(fh, ADIO_FCNTL_GET_FSIZE, fcntl_struct, &error_code); + ADIO_Fcntl(adio_fh, ADIO_FCNTL_GET_FSIZE, fcntl_struct, &error_code); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); /* --END ERROR HANDLING-- */ *size = fcntl_struct->fsize; ADIOI_Free(fcntl_struct); #ifdef MPI_hpux - HPMP_IO_END(fl_xmpi, fh, MPI_DATATYPE_NULL, -1); + HPMP_IO_END(fl_xmpi, adio_fh, MPI_DATATYPE_NULL, -1); #endif /* MPI_hpux */ fn_exit: diff --git a/ompi/mca/io/romio/romio/mpi-io/get_view.c b/ompi/mca/io/romio/romio/mpi-io/get_view.c index ba2a249c1e..cbe48f8637 100644 --- a/ompi/mca/io/romio/romio/mpi-io/get_view.c +++ b/ompi/mca/io/romio/romio/mpi-io/get_view.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -40,55 +40,53 @@ Output Parameters: .N fortran @*/ -int MPI_File_get_view(MPI_File mpi_fh, - MPI_Offset *disp, - MPI_Datatype *etype, - MPI_Datatype *filetype, - char *datarep) +int MPI_File_get_view(MPI_File fh, MPI_Offset *disp, MPI_Datatype *etype, + MPI_Datatype *filetype, char *datarep) { int error_code; - ADIO_File fh; + ADIO_File adio_fh; static char myname[] = "MPI_FILE_GET_VIEW"; int i, j, k, combiner; MPI_Datatype copy_etype, copy_filetype; MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); if (datarep <= (char *) 0) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**iodatarepnomem", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ - *disp = fh->disp; - ADIOI_Strncpy(datarep, "native", MPI_MAX_DATAREP_STRING); + *disp = adio_fh->disp; + ADIOI_Strncpy(datarep, + (adio_fh->is_external32 ? "external32": "native"), MPI_MAX_DATAREP_STRING); - MPI_Type_get_envelope(fh->etype, &i, &j, &k, &combiner); - if (combiner == MPI_COMBINER_NAMED) *etype = fh->etype; + MPI_Type_get_envelope(adio_fh->etype, &i, &j, &k, &combiner); + if (combiner == MPI_COMBINER_NAMED) *etype = adio_fh->etype; else { /* FIXME: It is wrong to use MPI_Type_contiguous; the user could choose to re-implement MPI_Type_contiguous in an unexpected way. Either use - MPIR_Barrier_impl as in MPICH2 or PMPI_Type_contiguous */ - MPI_Type_contiguous(1, fh->etype, ©_etype); + MPIR_Barrier_impl as in MPICH or PMPI_Type_contiguous */ + MPI_Type_contiguous(1, adio_fh->etype, ©_etype); /* FIXME: Ditto for MPI_Type_commit - use NMPI or PMPI */ MPI_Type_commit(©_etype); *etype = copy_etype; } /* FIXME: Ditto for MPI_Type_xxx - use NMPI or PMPI */ - MPI_Type_get_envelope(fh->filetype, &i, &j, &k, &combiner); - if (combiner == MPI_COMBINER_NAMED) *filetype = fh->filetype; + MPI_Type_get_envelope(adio_fh->filetype, &i, &j, &k, &combiner); + if (combiner == MPI_COMBINER_NAMED) *filetype = adio_fh->filetype; else { - MPI_Type_contiguous(1, fh->filetype, ©_filetype); + MPI_Type_contiguous(1, adio_fh->filetype, ©_filetype); MPI_Type_commit(©_filetype); *filetype = copy_filetype; diff --git a/ompi/mca/io/romio/romio/mpi-io/glue/Makefile.mk b/ompi/mca/io/romio/romio/mpi-io/glue/Makefile.mk new file mode 100644 index 0000000000..69675dac65 --- /dev/null +++ b/ompi/mca/io/romio/romio/mpi-io/glue/Makefile.mk @@ -0,0 +1,10 @@ +## -*- Mode: Makefile; -*- +## vim: set ft=automake : +## +## (C) 2011 by Argonne National Laboratory. +## See COPYRIGHT in top-level directory. +## + +include $(top_srcdir)/mpi-io/glue/default/Makefile.mk +include $(top_srcdir)/mpi-io/glue/mpich/Makefile.mk +include $(top_srcdir)/mpi-io/glue/openmpi/Makefile.mk diff --git a/ompi/mca/io/romio/romio/mpi-io/glue/default/Makefile.in b/ompi/mca/io/romio/romio/mpi-io/glue/default/Makefile.in deleted file mode 100644 index 51cde8a0d9..0000000000 --- a/ompi/mca/io/romio/romio/mpi-io/glue/default/Makefile.in +++ /dev/null @@ -1,52 +0,0 @@ -CC = @CC@ -AR = @AR@ -LIBNAME = @LIBNAME@ -RANLIB = @RANLIB@ -srcdir = @srcdir@ -CC_SHL = @CC_SHL@ -SHLIBNAME = @SHLIBNAME@ - -INCLUDE_DIR = -I@MPI_INCLUDE_DIR@ -I../../../include -I${srcdir}/../../../mpi-io -I${srcdir}/../../../adio/include -I../../../adio/include -I${srcdir}/../../../../../../src/include -I../../../../../../src/include -CFLAGS = -DHAVE_MPI_INFO_SRC @CPPFLAGS@ @CFLAGS@ $(MPIOPROFILE) $(INCLUDE_DIR) - -top_builddir = @master_topbuild_dir@ -LIBTOOL = @LIBTOOL@ -C_COMPILE_SHL = $(CC_SHL) - -@VPATH@ - -MPIO_OBJECTS = mpio_file.o mpio_err.o - -all: $(LIBNAME) - @if [ "@ENABLE_SHLIB@" != "none" ] ; then \ - $(MAKE) $(SHLIBNAME).la ;\ - fi - -.SUFFIXES: $(SUFFIXES) .p .lo - -.c.o: - $(CC) $(CFLAGS) -c $< -.c.lo: - $(C_COMPILE_SHL) $(CFLAGS) -c $< -o _s$*.o - @mv -f _s$*.o $*.lo - -.c.p: - @cp $(srcdir)/$*.c _$*.c - $(CC) $(CFLAGS) -c _$*.c - @rm -f _$*.c - -profile: - sleep 1 - -$(LIBNAME): $(MPIO_OBJECTS) - $(AR) $(LIBNAME) $(MPIO_OBJECTS) - $(RANLIB) $(LIBNAME) - -MPIO_LOOBJECTS = $(MPIO_OBJECTS:.o=.lo) -$(SHLIBNAME).la: $(MPIO_LOOBJECTS) - $(AR) $(SHLIBNAME).la $(MPIO_LOOBJECTS) - -clean: - @rm -f *.o *.lo *.gcno *.gcda *.bb *.bbg - @rm -f ${srcdir}/*.gcno ${srcdir}/*.gcda - @rm -f ${srcdir}/*.bb ${srcdir}/*.bbg diff --git a/ompi/mca/io/romio/romio/mpi-io/glue/default/Makefile.mk b/ompi/mca/io/romio/romio/mpi-io/glue/default/Makefile.mk new file mode 100644 index 0000000000..96995410b7 --- /dev/null +++ b/ompi/mca/io/romio/romio/mpi-io/glue/default/Makefile.mk @@ -0,0 +1,13 @@ +## -*- Mode: Makefile; -*- +## vim: set ft=automake : +## +## (C) 2011 by Argonne National Laboratory. +## See COPYRIGHT in top-level directory. +## + +if MPIO_GLUE_DEFAULT +romio_other_sources += \ + mpi-io/glue/default/mpio_file.c \ + mpi-io/glue/default/mpio_err.c +endif MPIO_GLUE_DEFAULT + diff --git a/ompi/mca/io/romio/romio/mpi-io/glue/default/mpio_err.c b/ompi/mca/io/romio/romio/mpi-io/glue/default/mpio_err.c index f24d67ca26..fbfc8a2c97 100644 --- a/ompi/mca/io/romio/romio/mpi-io/glue/default/mpio_err.c +++ b/ompi/mca/io/romio/romio/mpi-io/glue/default/mpio_err.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 2004 University of Chicago. * See COPYRIGHT notice in top-level directory. @@ -83,8 +83,6 @@ int MPIO_Err_return_comm(MPI_Comm mpi_comm, int error_code) { MPI_Abort(mpi_comm, 1); } - else - { - return error_code; - } + + return error_code; } diff --git a/ompi/mca/io/romio/romio/mpi-io/glue/default/mpio_file.c b/ompi/mca/io/romio/romio/mpi-io/glue/default/mpio_file.c index 5dd2ea238a..7a43b01b94 100644 --- a/ompi/mca/io/romio/romio/mpi-io/glue/default/mpio_file.c +++ b/ompi/mca/io/romio/romio/mpi-io/glue/default/mpio_file.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2004 University of Chicago. @@ -21,7 +21,7 @@ MPI_File MPIO_File_create(int size) { MPI_File mpi_fh; - mpi_fh = (MPI_File) ADIOI_Malloc(size); + mpi_fh = (MPI_File) ADIOI_Calloc(size,1); return mpi_fh; } @@ -52,7 +52,8 @@ MPI_File MPIO_File_f2c(MPI_Fint fh) if (!fh) return MPI_FILE_NULL; if ((fh < 0) || (fh > ADIOI_Ftable_ptr)) { FPRINTF(stderr, "MPI_File_f2c: Invalid file handle\n"); - MPI_Abort(MPI_COMM_WORLD, 1); + /* there is no way to return an error from MPI_File_f2c */ + return MPI_FILE_NULL; } return ADIOI_Ftable[fh]; #endif diff --git a/ompi/mca/io/romio/romio/mpi-io/glue/mpich/Makefile.mk b/ompi/mca/io/romio/romio/mpi-io/glue/mpich/Makefile.mk new file mode 100644 index 0000000000..4578670a31 --- /dev/null +++ b/ompi/mca/io/romio/romio/mpi-io/glue/mpich/Makefile.mk @@ -0,0 +1,12 @@ +## -*- Mode: Makefile; -*- +## vim: set ft=automake : +## +## (C) 2011 by Argonne National Laboratory. +## See COPYRIGHT in top-level directory. +## + +if MPIO_GLUE_MPICH +romio_other_sources += \ + mpi-io/glue/mpich/mpio_file.c \ + mpi-io/glue/mpich/mpio_err.c +endif MPIO_GLUE_MPICH diff --git a/ompi/mca/io/romio/romio/mpi-io/glue/mpich2/mpio_err.c b/ompi/mca/io/romio/romio/mpi-io/glue/mpich/mpio_err.c similarity index 72% rename from ompi/mca/io/romio/romio/mpi-io/glue/mpich2/mpio_err.c rename to ompi/mca/io/romio/romio/mpi-io/glue/mpich/mpio_err.c index e59b688c74..7a74f215fb 100644 --- a/ompi/mca/io/romio/romio/mpi-io/glue/mpich2/mpio_err.c +++ b/ompi/mca/io/romio/romio/mpi-io/glue/mpich/mpio_err.c @@ -1,6 +1,6 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ -/* - * Copyright (C) 2004 University of Chicago. +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ +/* + * Copyright (C) 2004 University of Chicago. * See COPYRIGHT notice in top-level directory. */ @@ -10,19 +10,25 @@ #include "mpioimpl.h" #include "adio_extern.h" -/* MPICH2 error handling implementation */ -/* FIXME: These external prototypes should be included from - mpich2/src/include/mpiext.h */ -int MPIR_Err_create_code_valist(int, int, const char [], int, int, +/* MPICH error handling implementation */ +/* FIXME: These external prototypes should be included from + mpich/src/include/mpiext.h */ +int MPIR_Err_create_code_valist(int, int, const char [], int, int, const char [], const char [], va_list ); int MPIR_Err_is_fatal(int); -void MPIR_Get_file_error_routine( MPI_Errhandler, - void (**)(MPI_File *, int *, ...), +void MPIR_Get_file_error_routine( MPI_Errhandler, + void (**)(MPI_File *, int *, ...), int * ); -int MPIR_File_call_cxx_errhandler( MPI_File *, int *, +int MPIR_File_call_cxx_errhandler( MPI_File *, int *, void (*)(MPI_File *, int *, ... ) ); +typedef int (* MPIR_Err_get_class_string_func_t)(int error, char *str, int length); +void MPIR_Err_get_string( int, char *, int, MPIR_Err_get_class_string_func_t ); + +struct MPID_Comm; +int MPID_Abort(struct MPID_Comm *comm, int mpi_errno, int exit_code, const char *error_msg); + int MPIO_Err_create_code(int lastcode, int fatal, const char fcname[], int line, int error_class, const char generic_msg[], const char specific_msg[], ... ) @@ -35,7 +41,7 @@ int MPIO_Err_create_code(int lastcode, int fatal, const char fcname[], error_code = MPIR_Err_create_code_valist(lastcode, fatal, fcname, line, error_class, generic_msg, specific_msg, Argp); - + va_end(Argp); return error_code; @@ -50,9 +56,9 @@ int MPIO_Err_return_file(MPI_File mpi_fh, int error_code) int len; /* If the file pointer is not valid, we use the handler on - MPI_FILE_NULL (MPI-2, section 9.7). For now, this code assumes that + MPI_FILE_NULL (MPI-2, section 9.7). For now, this code assumes that MPI_FILE_NULL has the default handler (return). FIXME. See - below - the set error handler uses ADIOI_DFLT_ERR_HANDLER; + below - the set error handler uses ADIOI_DFLT_ERR_HANDLER; */ /* First, get the handler and the corresponding function */ @@ -66,10 +72,10 @@ int MPIO_Err_return_file(MPI_File mpi_fh, int error_code) e = fh->err_handler; } - /* Actually, e is just the value provide by the MPICH2 routines + /* Actually, e is just the value provide by the MPICH routines file_set_errhandler. This is actually a *pointer* to the errhandler structure. We don't know that, so we ask - the MPICH2 code to translate this object into an error handler. + the MPICH code to translate this object into an error handler. kind = 0: errors are fatal kind = 1: errors return kind = 2: errors call function @@ -84,7 +90,7 @@ int MPIO_Err_return_file(MPI_File mpi_fh, int error_code) } /* --BEGIN ERROR HANDLING-- */ - if (MPIR_Err_is_fatal(error_code) || kind == 0) + if (MPIR_Err_is_fatal(error_code) || kind == 0) { ADIOI_Snprintf(error_msg, 4096, "I/O error: "); len = (int)strlen(error_msg); @@ -93,7 +99,7 @@ int MPIO_Err_return_file(MPI_File mpi_fh, int error_code) } /* --END ERROR HANDLING-- */ else if (kind == 2) { - (*c_errhandler)( &mpi_fh, &error_code, 0 ); + (*c_errhandler)( &mpi_fh, &error_code, 0 ); } else if (kind == 3) { MPIR_File_call_cxx_errhandler( &mpi_fh, &error_code, c_errhandler ); @@ -105,7 +111,7 @@ int MPIO_Err_return_file(MPI_File mpi_fh, int error_code) int MPIO_Err_return_comm(MPI_Comm mpi_comm, int error_code) { - /* note: MPI calls inside the MPICH2 implementation are prefixed + /* note: MPI calls inside the MPICH implementation are prefixed * with an "N", indicating a nested call. */ MPI_Comm_call_errhandler(mpi_comm, error_code); diff --git a/ompi/mca/io/romio/romio/mpi-io/glue/mpich2/mpio_file.c b/ompi/mca/io/romio/romio/mpi-io/glue/mpich/mpio_file.c similarity index 84% rename from ompi/mca/io/romio/romio/mpi-io/glue/mpich2/mpio_file.c rename to ompi/mca/io/romio/romio/mpi-io/glue/mpich/mpio_file.c index a52f97f92f..4a8e95c354 100644 --- a/ompi/mca/io/romio/romio/mpi-io/glue/mpich2/mpio_file.c +++ b/ompi/mca/io/romio/romio/mpi-io/glue/mpich/mpio_file.c @@ -1,7 +1,7 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ -/* +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ +/* * - * Copyright (C) 2004 University of Chicago. + * Copyright (C) 2004 University of Chicago. * See COPYRIGHT notice in top-level directory. */ @@ -23,7 +23,7 @@ MPI_File MPIO_File_create(int size) { MPI_File mpi_fh; - mpi_fh = (MPI_File) ADIOI_Malloc(size); + mpi_fh = (MPI_File) ADIOI_Calloc(size,1); return mpi_fh; } @@ -41,7 +41,7 @@ void MPIO_File_free(MPI_File *mpi_fh) MPI_File MPIO_File_f2c(MPI_Fint fh) { #ifndef INT_LT_POINTER - return (MPI_File) ((void *) fh); + return (MPI_File) ((void *) fh); /* the extra cast is to get rid of a compiler warning on Exemplar. The warning is because MPI_File points to a structure containing longlongs, which may be 8-byte aligned. But MPI_Fint itself @@ -72,15 +72,15 @@ MPI_Fint MPIO_File_c2f(MPI_File fh) if (!ADIOI_Ftable) { ADIOI_Ftable_max = 1024; ADIOI_Ftable = (MPI_File *) - ADIOI_Malloc(ADIOI_Ftable_max*sizeof(MPI_File)); - ADIOI_Ftable_ptr = 0; /* 0 can't be used though, because + ADIOI_Malloc(ADIOI_Ftable_max*sizeof(MPI_File)); + ADIOI_Ftable_ptr = 0; /* 0 can't be used though, because MPI_FILE_NULL=0 */ for (i=0; i -#include - -#include "mpioimpl.h" -#include "adio_extern.h" - -/* MPICH1 error handling implementation */ - -int MPIO_Err_create_code(int lastcode, int fatal, const char fcname[], - int line, int error_class, const char generic_msg[], - const char specific_msg[], ... ) -{ - va_list Argp; - int error_code; - - va_start(Argp, specific_msg); - - error_code = MPIR_Err_setmsg(error_class, 0, fcname, generic_msg, - specific_msg, Argp); - - vfprintf(stderr, specific_msg, Argp); - - va_end(Argp); - - return error_code; -} - -int MPIO_Err_return_file(MPI_File mpi_fh, int error_code) -{ - char buf[MPI_MAX_ERROR_STRING]; - int myrank, result_len; - MPI_Errhandler err_handler; - - if (mpi_fh == MPI_FILE_NULL) err_handler = ADIOI_DFLT_ERR_HANDLER; - else { - ADIO_File fh; - fh = MPIO_File_resolve(mpi_fh); - err_handler = fh->err_handler; - } - - MPI_Comm_rank(MPI_COMM_WORLD, &myrank); - if (err_handler == MPI_ERRORS_ARE_FATAL) { - MPI_Error_string(error_code, buf, &result_len); - FPRINTF(stderr, "[%d] %s\n", myrank, buf); - MPI_Abort(MPI_COMM_WORLD, 1); - } - else if (err_handler != MPI_ERRORS_RETURN) { - FPRINTF(stderr, "Only MPI_ERRORS_RETURN and MPI_ERRORS_ARE_FATAL are currently supported as error handlers for files\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - return error_code; -} - -int MPIO_Err_return_comm(MPI_Comm mpi_comm, int error_code) -{ - return MPIO_Err_return_file(MPI_FILE_NULL, error_code); -} diff --git a/ompi/mca/io/romio/romio/mpi-io/glue/mpich1/mpio_file.c b/ompi/mca/io/romio/romio/mpi-io/glue/mpich1/mpio_file.c deleted file mode 100644 index aaee32b98d..0000000000 --- a/ompi/mca/io/romio/romio/mpi-io/glue/mpich1/mpio_file.c +++ /dev/null @@ -1,94 +0,0 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ -/* - * - * Copyright (C) 2004 University of Chicago. - * See COPYRIGHT notice in top-level directory. - */ - -#include "mpioimpl.h" -#include "adio_extern.h" - -/* Hooks for allocation of MPI_File handles. - * - * Three functions are used in ROMIO for allocation/deallocation - * of MPI_File structures: - * - MPIO_File_create(size) - * - MPIO_File_resolve(mpi_fh) - * - MPIO_File_free(mpi_fh) - * - */ - -MPI_File MPIO_File_create(int size) -{ - MPI_File mpi_fh; - - mpi_fh = (MPI_File) ADIOI_Malloc(size); - return mpi_fh; -} - -ADIO_File MPIO_File_resolve(MPI_File mpi_fh) -{ - return mpi_fh; -} - -void MPIO_File_free(MPI_File *mpi_fh) -{ - ADIOI_Free(*mpi_fh); - *mpi_fh = MPI_FILE_NULL; -} - -MPI_File MPIO_File_f2c(MPI_Fint fh) -{ -#ifndef INT_LT_POINTER - return (MPI_File) ((void *) fh); - /* the extra cast is to get rid of a compiler warning on Exemplar. - The warning is because MPI_File points to a structure containing - longlongs, which may be 8-byte aligned. But MPI_Fint itself - may not be 8-byte aligned.*/ -#else - if (!fh) return MPI_FILE_NULL; - - /* --BEGIN ERROR HANDLING-- */ - if ((fh < 0) || (fh > ADIOI_Ftable_ptr)) { - /* there is no way to return an error code from MPI_File_f2c */ - return MPI_FILE_NULL; - } - /* --END ERROR HANDLING-- */ - return ADIOI_Ftable[fh]; -#endif -} - -MPI_Fint MPIO_File_c2f(MPI_File fh) -{ -#ifndef INT_LT_POINTER - return (MPI_Fint) fh; -#else - int i; - - if ((fh <= (MPI_File) 0) || (fh->cookie != ADIOI_FILE_COOKIE)) - return (MPI_Fint) 0; - - if (fh->fortran_handle != -1) - return fh->fortran_handle; - - if (!ADIOI_Ftable) { - ADIOI_Ftable_max = 1024; - ADIOI_Ftable = (MPI_File *) - ADIOI_Malloc(ADIOI_Ftable_max*sizeof(MPI_File)); - ADIOI_Ftable_ptr = 0; /* 0 can't be used though, because - MPI_FILE_NULL=0 */ - for (i=0; ifortran_handle = ADIOI_Ftable_ptr; - return (MPI_Fint) ADIOI_Ftable_ptr; -#endif -} diff --git a/ompi/mca/io/romio/romio/mpi-io/glue/mpich2/Makefile.in b/ompi/mca/io/romio/romio/mpi-io/glue/mpich2/Makefile.in deleted file mode 100644 index 51cde8a0d9..0000000000 --- a/ompi/mca/io/romio/romio/mpi-io/glue/mpich2/Makefile.in +++ /dev/null @@ -1,52 +0,0 @@ -CC = @CC@ -AR = @AR@ -LIBNAME = @LIBNAME@ -RANLIB = @RANLIB@ -srcdir = @srcdir@ -CC_SHL = @CC_SHL@ -SHLIBNAME = @SHLIBNAME@ - -INCLUDE_DIR = -I@MPI_INCLUDE_DIR@ -I../../../include -I${srcdir}/../../../mpi-io -I${srcdir}/../../../adio/include -I../../../adio/include -I${srcdir}/../../../../../../src/include -I../../../../../../src/include -CFLAGS = -DHAVE_MPI_INFO_SRC @CPPFLAGS@ @CFLAGS@ $(MPIOPROFILE) $(INCLUDE_DIR) - -top_builddir = @master_topbuild_dir@ -LIBTOOL = @LIBTOOL@ -C_COMPILE_SHL = $(CC_SHL) - -@VPATH@ - -MPIO_OBJECTS = mpio_file.o mpio_err.o - -all: $(LIBNAME) - @if [ "@ENABLE_SHLIB@" != "none" ] ; then \ - $(MAKE) $(SHLIBNAME).la ;\ - fi - -.SUFFIXES: $(SUFFIXES) .p .lo - -.c.o: - $(CC) $(CFLAGS) -c $< -.c.lo: - $(C_COMPILE_SHL) $(CFLAGS) -c $< -o _s$*.o - @mv -f _s$*.o $*.lo - -.c.p: - @cp $(srcdir)/$*.c _$*.c - $(CC) $(CFLAGS) -c _$*.c - @rm -f _$*.c - -profile: - sleep 1 - -$(LIBNAME): $(MPIO_OBJECTS) - $(AR) $(LIBNAME) $(MPIO_OBJECTS) - $(RANLIB) $(LIBNAME) - -MPIO_LOOBJECTS = $(MPIO_OBJECTS:.o=.lo) -$(SHLIBNAME).la: $(MPIO_LOOBJECTS) - $(AR) $(SHLIBNAME).la $(MPIO_LOOBJECTS) - -clean: - @rm -f *.o *.lo *.gcno *.gcda *.bb *.bbg - @rm -f ${srcdir}/*.gcno ${srcdir}/*.gcda - @rm -f ${srcdir}/*.bb ${srcdir}/*.bbg diff --git a/ompi/mca/io/romio/romio/mpi-io/glue/openmpi/Makefile.am b/ompi/mca/io/romio/romio/mpi-io/glue/openmpi/Makefile.am deleted file mode 100644 index aac100937a..0000000000 --- a/ompi/mca/io/romio/romio/mpi-io/glue/openmpi/Makefile.am +++ /dev/null @@ -1,27 +0,0 @@ -# -# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana -# University Research and Technology -# Corporation. All rights reserved. -# Copyright (c) 2004-2005 The University of Tennessee and The University -# of Tennessee Research Foundation. All rights -# reserved. -# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, -# University of Stuttgart. All rights reserved. -# Copyright (c) 2004-2005 The Regents of the University of California. -# All rights reserved. -# $COPYRIGHT$ -# -# Additional copyrights may follow -# -# $HEADER$ -# - -include $(top_srcdir)/Makefile.options - -AM_CPPFLAGS += \ - -I$(top_srcdir)/mpi-io - -noinst_LTLIBRARIES = libglue.la -libglue_la_SOURCES = \ - mpio_err.c \ - mpio_file.c diff --git a/ompi/mca/io/romio/romio/mpi-io/glue/openmpi/Makefile.mk b/ompi/mca/io/romio/romio/mpi-io/glue/openmpi/Makefile.mk new file mode 100644 index 0000000000..ab7c15078e --- /dev/null +++ b/ompi/mca/io/romio/romio/mpi-io/glue/openmpi/Makefile.mk @@ -0,0 +1,13 @@ +## -*- Mode: Makefile; -*- +## vim: set ft=automake : +## +## (C) 2011 by Argonne National Laboratory. +## See COPYRIGHT in top-level directory. +## + +if MPIO_GLUE_OPENMPI +romio_other_sources += \ + mpi-io/glue/openmpi/mpio_file.c \ + mpi-io/glue/openmpi/mpio_err.c +endif MPIO_GLUE_OPENMPI + diff --git a/ompi/mca/io/romio/romio/mpi-io/ioreq_c2f.c b/ompi/mca/io/romio/romio/mpi-io/ioreq_c2f.c index 72708b8b79..30f4b95057 100644 --- a/ompi/mca/io/romio/romio/mpi-io/ioreq_c2f.c +++ b/ompi/mca/io/romio/romio/mpi-io/ioreq_c2f.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/ioreq_f2c.c b/ompi/mca/io/romio/romio/mpi-io/ioreq_f2c.c index 670319d364..339f34f487 100644 --- a/ompi/mca/io/romio/romio/mpi-io/ioreq_f2c.c +++ b/ompi/mca/io/romio/romio/mpi-io/ioreq_f2c.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/iotest.c b/ompi/mca/io/romio/romio/mpi-io/iotest.c index df1671bb09..9ca273d49d 100644 --- a/ompi/mca/io/romio/romio/mpi-io/iotest.c +++ b/ompi/mca/io/romio/romio/mpi-io/iotest.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/iotestall.c b/ompi/mca/io/romio/romio/mpi-io/iotestall.c index 23b812f96f..03a7586354 100644 --- a/ompi/mca/io/romio/romio/mpi-io/iotestall.c +++ b/ompi/mca/io/romio/romio/mpi-io/iotestall.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2003 University of Chicago. @@ -53,7 +53,7 @@ int MPIO_Testall(int count, MPIO_Request requests[], int *flag, if (err) goto fn_exit; } else { -#ifdef MPICH2 +#ifdef MPICH /* need to set empty status */ if (statuses != MPI_STATUSES_IGNORE) { statuses[i].MPI_SOURCE = MPI_ANY_SOURCE; diff --git a/ompi/mca/io/romio/romio/mpi-io/iotestany.c b/ompi/mca/io/romio/romio/mpi-io/iotestany.c index 609bc18588..7632064a96 100644 --- a/ompi/mca/io/romio/romio/mpi-io/iotestany.c +++ b/ompi/mca/io/romio/romio/mpi-io/iotestany.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2003 University of Chicago. @@ -50,7 +50,7 @@ int MPIO_Testany(int count, MPIO_Request requests[], int *index, } if (i == count) { *index = MPI_UNDEFINED; -#ifdef MPICH2 +#ifdef MPICH /* need to set empty status */ if (status != MPI_STATUS_IGNORE) { status->MPI_SOURCE = MPI_ANY_SOURCE; diff --git a/ompi/mca/io/romio/romio/mpi-io/iotestsome.c b/ompi/mca/io/romio/romio/mpi-io/iotestsome.c index 451276ea7e..994376ad56 100644 --- a/ompi/mca/io/romio/romio/mpi-io/iotestsome.c +++ b/ompi/mca/io/romio/romio/mpi-io/iotestsome.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2003 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/iowait.c b/ompi/mca/io/romio/romio/mpi-io/iowait.c index f00cc3a153..4b592bfafc 100644 --- a/ompi/mca/io/romio/romio/mpi-io/iowait.c +++ b/ompi/mca/io/romio/romio/mpi-io/iowait.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/iowaitall.c b/ompi/mca/io/romio/romio/mpi-io/iowaitall.c index b8e7dbd22f..ef22ae8e2e 100644 --- a/ompi/mca/io/romio/romio/mpi-io/iowaitall.c +++ b/ompi/mca/io/romio/romio/mpi-io/iowaitall.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2003 University of Chicago. @@ -50,7 +50,7 @@ int MPIO_Waitall( int count, MPIO_Request requests[], MPI_Status statuses[] ) if (err) goto fn_exit; } else { -#ifdef MPICH2 +#ifdef MPICH /* need to set empty status */ if (statuses != MPI_STATUSES_IGNORE) { statuses[i].MPI_SOURCE = MPI_ANY_SOURCE; diff --git a/ompi/mca/io/romio/romio/mpi-io/iowaitany.c b/ompi/mca/io/romio/romio/mpi-io/iowaitany.c index 4f408cb453..101fc5750f 100644 --- a/ompi/mca/io/romio/romio/mpi-io/iowaitany.c +++ b/ompi/mca/io/romio/romio/mpi-io/iowaitany.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2003 University of Chicago. @@ -50,7 +50,7 @@ int MPIO_Waitany(int count, MPIO_Request requests[], int *index, } if (i == count) { *index = MPI_UNDEFINED; -#ifdef MPICH2 +#ifdef MPICH /* need to set empty status */ if (status != MPI_STATUS_IGNORE) { status->MPI_SOURCE = MPI_ANY_SOURCE; diff --git a/ompi/mca/io/romio/romio/mpi-io/iowaitsome.c b/ompi/mca/io/romio/romio/mpi-io/iowaitsome.c index 2e3a296435..8b899f570b 100644 --- a/ompi/mca/io/romio/romio/mpi-io/iowaitsome.c +++ b/ompi/mca/io/romio/romio/mpi-io/iowaitsome.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 2003 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/iread.c b/ompi/mca/io/romio/romio/mpi-io/iread.c index 56d622278b..fb07e70b38 100644 --- a/ompi/mca/io/romio/romio/mpi-io/iread.c +++ b/ompi/mca/io/romio/romio/mpi-io/iread.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -22,6 +22,11 @@ #define MPIO_BUILD_PROFILING #include "mpioprof.h" #endif + +#ifdef HAVE_MPI_GREQUEST +#include "mpiu_greq.h" +#endif + /*@ MPI_File_iread - Nonblocking read using individual file pointer @@ -36,70 +41,59 @@ Output Parameters: .N fortran @*/ -#ifdef HAVE_MPI_GREQUEST -#include "mpiu_greq.h" -#endif - -int MPI_File_iread(MPI_File mpi_fh, void *buf, int count, - MPI_Datatype datatype, MPI_Request *request) +int MPI_File_iread(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPI_Request *request) { int error_code=MPI_SUCCESS; static char myname[] = "MPI_FILE_IREAD"; #ifdef MPI_hpux int fl_xmpi; - HPMP_IO_START(fl_xmpi, BLKMPIFILEIREAD, TRDTSYSTEM, mpi_fh, datatype, + HPMP_IO_START(fl_xmpi, BLKMPIFILEIREAD, TRDTSYSTEM, fh, datatype, count); #endif /* MPI_hpux */ - MPIU_THREAD_CS_ENTER(ALLFUNC,); - error_code = MPIOI_File_iread(mpi_fh, (MPI_Offset) 0, ADIO_INDIVIDUAL, + error_code = MPIOI_File_iread(fh, (MPI_Offset) 0, ADIO_INDIVIDUAL, buf, count, datatype, myname, request); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) - error_code = MPIO_Err_return_file(mpi_fh, error_code); + error_code = MPIO_Err_return_file(fh, error_code); /* --END ERROR HANDLING-- */ #ifdef MPI_hpux - HPMP_IO_END(fl_xmpi, mpi_fh, datatype, count); + HPMP_IO_END(fl_xmpi, fh, datatype, count); #endif /* MPI_hpux */ - MPIU_THREAD_CS_EXIT(ALLFUNC,); return error_code; } /* prevent multiple definitions of this routine */ #ifdef MPIO_BUILD_PROFILING -int MPIOI_File_iread(MPI_File mpi_fh, - MPI_Offset offset, - int file_ptr_type, - void *buf, - int count, - MPI_Datatype datatype, - char *myname, - MPI_Request *request) +int MPIOI_File_iread(MPI_File fh, MPI_Offset offset, int file_ptr_type, void *buf, int count, + MPI_Datatype datatype, char *myname, MPI_Request *request) { int error_code, bufsize, buftype_is_contig, filetype_is_contig; int datatype_size; ADIO_Status status; - ADIO_File fh; + ADIO_File adio_fh; ADIO_Offset off; MPI_Offset nbytes=0; - fh = MPIO_File_resolve(mpi_fh); + MPIU_THREAD_CS_ENTER(ALLFUNC,); + + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); - MPIO_CHECK_COUNT(fh, count, myname, error_code); - MPIO_CHECK_DATATYPE(fh, datatype, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); + MPIO_CHECK_COUNT(adio_fh, count, myname, error_code); + MPIO_CHECK_DATATYPE(adio_fh, datatype, myname, error_code); if (file_ptr_type == ADIO_EXPLICIT_OFFSET && offset < 0) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**iobadoffset", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ @@ -107,56 +101,57 @@ int MPIOI_File_iread(MPI_File mpi_fh, MPI_Type_size(datatype, &datatype_size); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_INTEGRAL_ETYPE(fh, count, datatype_size, myname, error_code); - MPIO_CHECK_READABLE(fh, myname, error_code); - MPIO_CHECK_NOT_SEQUENTIAL_MODE(fh, myname, error_code); - MPIO_CHECK_COUNT_SIZE(fh, count, datatype_size, myname, error_code); + MPIO_CHECK_INTEGRAL_ETYPE(adio_fh, count, datatype_size, myname, error_code); + MPIO_CHECK_READABLE(adio_fh, myname, error_code); + MPIO_CHECK_NOT_SEQUENTIAL_MODE(adio_fh, myname, error_code); + MPIO_CHECK_COUNT_SIZE(adio_fh, count, datatype_size, myname, error_code); /* --END ERROR HANDLING-- */ ADIOI_Datatype_iscontig(datatype, &buftype_is_contig); - ADIOI_Datatype_iscontig(fh->filetype, &filetype_is_contig); + ADIOI_Datatype_iscontig(adio_fh->filetype, &filetype_is_contig); - ADIOI_TEST_DEFERRED(fh, myname, &error_code); + ADIOI_TEST_DEFERRED(adio_fh, myname, &error_code); if (buftype_is_contig && filetype_is_contig) { /* convert count and offset to bytes */ bufsize = datatype_size * count; if (file_ptr_type == ADIO_EXPLICIT_OFFSET) { - off = fh->disp + fh->etype_size * offset; + off = adio_fh->disp + adio_fh->etype_size * offset; } else { - off = fh->fp_ind; + off = adio_fh->fp_ind; } - if (!(fh->atomicity)) - ADIO_IreadContig(fh, buf, count, datatype, file_ptr_type, + if (!(adio_fh->atomicity)) + ADIO_IreadContig(adio_fh, buf, count, datatype, file_ptr_type, off, request, &error_code); else { /* to maintain strict atomicity semantics with other concurrent operations, lock (exclusive) and call blocking routine */ - if (ADIO_Feature(fh, ADIO_LOCKS)) + if (ADIO_Feature(adio_fh, ADIO_LOCKS)) { - ADIOI_WRITE_LOCK(fh, off, SEEK_SET, bufsize); + ADIOI_WRITE_LOCK(adio_fh, off, SEEK_SET, bufsize); } - ADIO_ReadContig(fh, buf, count, datatype, file_ptr_type, + ADIO_ReadContig(adio_fh, buf, count, datatype, file_ptr_type, off, &status, &error_code); - if (ADIO_Feature(fh, ADIO_LOCKS)) + if (ADIO_Feature(adio_fh, ADIO_LOCKS)) { - ADIOI_UNLOCK(fh, off, SEEK_SET, bufsize); + ADIOI_UNLOCK(adio_fh, off, SEEK_SET, bufsize); } if (error_code == MPI_SUCCESS) { nbytes = count*datatype_size; } - MPIO_Completed_request_create(&fh, nbytes, &error_code, request); + MPIO_Completed_request_create(&adio_fh, nbytes, &error_code, request); } } - else ADIO_IreadStrided(fh, buf, count, datatype, file_ptr_type, + else ADIO_IreadStrided(adio_fh, buf, count, datatype, file_ptr_type, offset, request, &error_code); fn_exit: + MPIU_THREAD_CS_EXIT(ALLFUNC,); return error_code; } diff --git a/ompi/mca/io/romio/romio/mpi-io/iread_at.c b/ompi/mca/io/romio/romio/mpi-io/iread_at.c index 8e04c2f48d..809ca5ca5d 100644 --- a/ompi/mca/io/romio/romio/mpi-io/iread_at.c +++ b/ompi/mca/io/romio/romio/mpi-io/iread_at.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -23,8 +23,12 @@ #include "mpioprof.h" #endif +#ifdef HAVE_MPI_GREQUEST +#include "mpiu_greq.h" +#endif + /*@ - MPI_File_iread_at - Nonblocking read using explict offset + MPI_File_iread_at - Nonblocking read using explicit offset Input Parameters: . fh - file handle (handle) @@ -38,13 +42,7 @@ Output Parameters: .N fortran @*/ -#ifdef HAVE_MPI_GREQUEST -#include "mpiu_greq.h" -#endif - - -int MPI_File_iread_at(MPI_File mpi_fh, MPI_Offset offset, void *buf, - int count, MPI_Datatype datatype, +int MPI_File_iread_at(MPI_File fh, MPI_Offset offset, void *buf, int count, MPI_Datatype datatype, MPIO_Request *request) { int error_code; @@ -53,21 +51,21 @@ int MPI_File_iread_at(MPI_File mpi_fh, MPI_Offset offset, void *buf, #ifdef MPI_hpux int fl_xmpi; - HPMP_IO_START(fl_xmpi, BLKMPIFILEIREADAT, TRDTSYSTEM, mpi_fh, datatype, + HPMP_IO_START(fl_xmpi, BLKMPIFILEIREADAT, TRDTSYSTEM, fh, datatype, count); #endif /* MPI_hpux */ - error_code = MPIOI_File_iread(mpi_fh, offset, ADIO_EXPLICIT_OFFSET, buf, + error_code = MPIOI_File_iread(fh, offset, ADIO_EXPLICIT_OFFSET, buf, count, datatype, myname, request); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) - error_code = MPIO_Err_return_file(mpi_fh, error_code); + error_code = MPIO_Err_return_file(fh, error_code); /* --END ERROR HANDLING-- */ #ifdef MPI_hpux - HPMP_IO_END(fl_xmpi, mpi_fh, datatype, count); + HPMP_IO_END(fl_xmpi, fh, datatype, count); #endif /* MPI_hpux */ return error_code; diff --git a/ompi/mca/io/romio/romio/mpi-io/iread_sh.c b/ompi/mca/io/romio/romio/mpi-io/iread_sh.c index 4d3d399f02..548e6c5db1 100644 --- a/ompi/mca/io/romio/romio/mpi-io/iread_sh.c +++ b/ompi/mca/io/romio/romio/mpi-io/iread_sh.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -23,6 +23,9 @@ #include "mpioprof.h" #endif +#ifdef HAVE_MPI_GREQUEST +#include "mpiu_greq.h" + /*@ MPI_File_iread_shared - Nonblocking read using shared file pointer @@ -37,15 +40,11 @@ Output Parameters: .N fortran @*/ -#ifdef HAVE_MPI_GREQUEST -#include "mpiu_greq.h" - - -int MPI_File_iread_shared(MPI_File mpi_fh, void *buf, int count, - MPI_Datatype datatype, MPI_Request *request) +int MPI_File_iread_shared(MPI_File fh, void *buf, int count, + MPI_Datatype datatype, MPI_Request *request) { int error_code, bufsize, buftype_is_contig, filetype_is_contig; - ADIO_File fh; + ADIO_File adio_fh; static char myname[] = "MPI_FILE_IREAD_SHARED"; int datatype_size, incr; MPI_Status status; @@ -54,35 +53,35 @@ int MPI_File_iread_shared(MPI_File mpi_fh, void *buf, int count, MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); - MPIO_CHECK_COUNT(fh, count, myname, error_code); - MPIO_CHECK_DATATYPE(fh, datatype, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); + MPIO_CHECK_COUNT(adio_fh, count, myname, error_code); + MPIO_CHECK_DATATYPE(adio_fh, datatype, myname, error_code); /* --END ERROR HANDLING-- */ MPI_Type_size(datatype, &datatype_size); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_INTEGRAL_ETYPE(fh, count, datatype_size, myname, error_code); - MPIO_CHECK_FS_SUPPORTS_SHARED(fh, myname, error_code); - MPIO_CHECK_COUNT_SIZE(fh, count, datatype_size, myname, error_code); + MPIO_CHECK_INTEGRAL_ETYPE(adio_fh, count, datatype_size, myname, error_code); + MPIO_CHECK_FS_SUPPORTS_SHARED(adio_fh, myname, error_code); + MPIO_CHECK_COUNT_SIZE(adio_fh, count, datatype_size, myname, error_code); /* --END ERROR HANDLING-- */ ADIOI_Datatype_iscontig(datatype, &buftype_is_contig); - ADIOI_Datatype_iscontig(fh->filetype, &filetype_is_contig); + ADIOI_Datatype_iscontig(adio_fh->filetype, &filetype_is_contig); - ADIOI_TEST_DEFERRED(fh, myname, &error_code); + ADIOI_TEST_DEFERRED(adio_fh, myname, &error_code); - incr = (count*datatype_size)/fh->etype_size; - ADIO_Get_shared_fp(fh, incr, &shared_fp, &error_code); + incr = (count*datatype_size)/adio_fh->etype_size; + ADIO_Get_shared_fp(adio_fh, incr, &shared_fp, &error_code); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) { /* note: ADIO_Get_shared_fp should have set up error code already? */ - MPIO_Err_return_file(fh, error_code); + MPIO_Err_return_file(adio_fh, error_code); } /* --END ERROR HANDLING-- */ @@ -90,10 +89,10 @@ int MPI_File_iread_shared(MPI_File mpi_fh, void *buf, int count, { /* convert count and shared_fp to bytes */ bufsize = datatype_size * count; - off = fh->disp + fh->etype_size * shared_fp; - if (!(fh->atomicity)) + off = adio_fh->disp + adio_fh->etype_size * shared_fp; + if (!(adio_fh->atomicity)) { - ADIO_IreadContig(fh, buf, count, datatype, ADIO_EXPLICIT_OFFSET, + ADIO_IreadContig(adio_fh, buf, count, datatype, ADIO_EXPLICIT_OFFSET, off, request, &error_code); } else @@ -101,33 +100,33 @@ int MPI_File_iread_shared(MPI_File mpi_fh, void *buf, int count, /* to maintain strict atomicity semantics with other concurrent operations, lock (exclusive) and call blocking routine */ - if (fh->file_system != ADIO_NFS) + if (adio_fh->file_system != ADIO_NFS) { - ADIOI_WRITE_LOCK(fh, off, SEEK_SET, bufsize); + ADIOI_WRITE_LOCK(adio_fh, off, SEEK_SET, bufsize); } - ADIO_ReadContig(fh, buf, count, datatype, ADIO_EXPLICIT_OFFSET, + ADIO_ReadContig(adio_fh, buf, count, datatype, ADIO_EXPLICIT_OFFSET, off, &status, &error_code); - if (fh->file_system != ADIO_NFS) + if (adio_fh->file_system != ADIO_NFS) { - ADIOI_UNLOCK(fh, off, SEEK_SET, bufsize); + ADIOI_UNLOCK(adio_fh, off, SEEK_SET, bufsize); } if (error_code == MPI_SUCCESS){ nbytes = count * datatype_size; } - MPIO_Completed_request_create(&fh, nbytes, &error_code, request); + MPIO_Completed_request_create(&adio_fh, nbytes, &error_code, request); } } else { - ADIO_IreadStrided(fh, buf, count, datatype, ADIO_EXPLICIT_OFFSET, + ADIO_IreadStrided(adio_fh, buf, count, datatype, ADIO_EXPLICIT_OFFSET, shared_fp, request, &error_code); } /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); /* --END ERROR HANDLING-- */ fn_exit: diff --git a/ompi/mca/io/romio/romio/mpi-io/iwrite.c b/ompi/mca/io/romio/romio/mpi-io/iwrite.c index 0ef20e4c1a..54872e49df 100644 --- a/ompi/mca/io/romio/romio/mpi-io/iwrite.c +++ b/ompi/mca/io/romio/romio/mpi-io/iwrite.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -41,7 +41,7 @@ Output Parameters: #include "mpiu_greq.h" #endif -int MPI_File_iwrite(MPI_File mpi_fh, void *buf, int count, +int MPI_File_iwrite(MPI_File fh, const void *buf, int count, MPI_Datatype datatype, MPI_Request *request) { int error_code=MPI_SUCCESS; @@ -49,34 +49,32 @@ int MPI_File_iwrite(MPI_File mpi_fh, void *buf, int count, #ifdef MPI_hpux int fl_xmpi; - HPMP_IO_START(fl_xmpi, BLKMPIFILEIWRITE, TRDTSYSTEM, mpi_fh, datatype, + HPMP_IO_START(fl_xmpi, BLKMPIFILEIWRITE, TRDTSYSTEM, fh, datatype, count); #endif /* MPI_hpux */ - MPIU_THREAD_CS_ENTER(ALLFUNC,); - error_code = MPIOI_File_iwrite(mpi_fh, (MPI_Offset) 0, ADIO_INDIVIDUAL, + error_code = MPIOI_File_iwrite(fh, (MPI_Offset) 0, ADIO_INDIVIDUAL, buf, count, datatype, myname, request); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) - error_code = MPIO_Err_return_file(mpi_fh, error_code); + error_code = MPIO_Err_return_file(fh, error_code); /* --END ERROR HANDLING-- */ #ifdef MPI_hpux - HPMP_IO_END(fl_xmpi, mpi_fh, datatype, count); + HPMP_IO_END(fl_xmpi, fh, datatype, count); #endif /* MPI_hpux */ - MPIU_THREAD_CS_EXIT(ALLFUNC,); return error_code; } /* prevent multiple definitions of this routine */ #ifdef MPIO_BUILD_PROFILING -int MPIOI_File_iwrite(MPI_File mpi_fh, +int MPIOI_File_iwrite(MPI_File fh, MPI_Offset offset, int file_ptr_type, - void *buf, + const void *buf, int count, MPI_Datatype datatype, char *myname, @@ -86,21 +84,22 @@ int MPIOI_File_iwrite(MPI_File mpi_fh, int datatype_size; ADIO_Status status; ADIO_Offset off; - ADIO_File fh; + ADIO_File adio_fh; MPI_Offset nbytes=0; - fh = MPIO_File_resolve(mpi_fh); + MPIU_THREAD_CS_ENTER(ALLFUNC,); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); - MPIO_CHECK_COUNT(fh, count, myname, error_code); - MPIO_CHECK_DATATYPE(fh, datatype, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); + MPIO_CHECK_COUNT(adio_fh, count, myname, error_code); + MPIO_CHECK_DATATYPE(adio_fh, datatype, myname, error_code); if (file_ptr_type == ADIO_EXPLICIT_OFFSET && offset < 0) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**iobadoffset", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ @@ -108,58 +107,59 @@ int MPIOI_File_iwrite(MPI_File mpi_fh, MPI_Type_size(datatype, &datatype_size); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_INTEGRAL_ETYPE(fh, count, datatype_size, myname, error_code); - MPIO_CHECK_WRITABLE(fh, myname, error_code); - MPIO_CHECK_NOT_SEQUENTIAL_MODE(fh, myname, error_code); - MPIO_CHECK_COUNT_SIZE(fh, count, datatype_size, myname, error_code); + MPIO_CHECK_INTEGRAL_ETYPE(adio_fh, count, datatype_size, myname, error_code); + MPIO_CHECK_WRITABLE(adio_fh, myname, error_code); + MPIO_CHECK_NOT_SEQUENTIAL_MODE(adio_fh, myname, error_code); + MPIO_CHECK_COUNT_SIZE(adio_fh, count, datatype_size, myname, error_code); /* --END ERROR HANDLING-- */ ADIOI_Datatype_iscontig(datatype, &buftype_is_contig); - ADIOI_Datatype_iscontig(fh->filetype, &filetype_is_contig); + ADIOI_Datatype_iscontig(adio_fh->filetype, &filetype_is_contig); - ADIOI_TEST_DEFERRED(fh, myname, &error_code); + ADIOI_TEST_DEFERRED(adio_fh, myname, &error_code); if (buftype_is_contig && filetype_is_contig) { /* convert sizes to bytes */ bufsize = datatype_size * count; if (file_ptr_type == ADIO_EXPLICIT_OFFSET) { - off = fh->disp + fh->etype_size * offset; + off = adio_fh->disp + adio_fh->etype_size * offset; } else { - off = fh->fp_ind; + off = adio_fh->fp_ind; } - if (!(fh->atomicity)) { - ADIO_IwriteContig(fh, buf, count, datatype, file_ptr_type, + if (!(adio_fh->atomicity)) { + ADIO_IwriteContig(adio_fh, buf, count, datatype, file_ptr_type, off, request, &error_code); } else { /* to maintain strict atomicity semantics with other concurrent operations, lock (exclusive) and call blocking routine */ - if (ADIO_Feature(fh, ADIO_LOCKS) ) + if (ADIO_Feature(adio_fh, ADIO_LOCKS) ) { - ADIOI_WRITE_LOCK(fh, off, SEEK_SET, bufsize); + ADIOI_WRITE_LOCK(adio_fh, off, SEEK_SET, bufsize); } - ADIO_WriteContig(fh, buf, count, datatype, file_ptr_type, off, + ADIO_WriteContig(adio_fh, buf, count, datatype, file_ptr_type, off, &status, &error_code); - if (ADIO_Feature(fh, ADIO_LOCKS) ) + if (ADIO_Feature(adio_fh, ADIO_LOCKS) ) { - ADIOI_UNLOCK(fh, off, SEEK_SET, bufsize); + ADIOI_UNLOCK(adio_fh, off, SEEK_SET, bufsize); } if (error_code == MPI_SUCCESS) { nbytes = count * datatype_size; } - MPIO_Completed_request_create(&fh, nbytes, &error_code, request); + MPIO_Completed_request_create(&adio_fh, nbytes, &error_code, request); } } else { - ADIO_IwriteStrided(fh, buf, count, datatype, file_ptr_type, + ADIO_IwriteStrided(adio_fh, buf, count, datatype, file_ptr_type, offset, request, &error_code); } fn_exit: + MPIU_THREAD_CS_EXIT(ALLFUNC,); return error_code; } #endif diff --git a/ompi/mca/io/romio/romio/mpi-io/iwrite_at.c b/ompi/mca/io/romio/romio/mpi-io/iwrite_at.c index 321a55398a..6974ed5fb6 100644 --- a/ompi/mca/io/romio/romio/mpi-io/iwrite_at.c +++ b/ompi/mca/io/romio/romio/mpi-io/iwrite_at.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -24,7 +24,7 @@ #endif /*@ - MPI_File_iwrite_at - Nonblocking write using explict offset + MPI_File_iwrite_at - Nonblocking write using explicit offset Input Parameters: . fh - file handle (handle) @@ -42,34 +42,34 @@ Output Parameters: #include "mpiu_greq.h" #endif -int MPI_File_iwrite_at(MPI_File mpi_fh, MPI_Offset offset, void *buf, +int MPI_File_iwrite_at(MPI_File fh, MPI_Offset offset, const void *buf, int count, MPI_Datatype datatype, MPIO_Request *request) { int error_code; - ADIO_File fh; + ADIO_File adio_fh; static char myname[] = "MPI_FILE_IWRITE_AT"; #ifdef MPI_hpux int fl_xmpi; HPMP_IO_START(fl_xmpi, BLKMPIFILEIWRITEAT, TRDTSYSTEM, - mpi_fh, datatype, count); + fh, datatype, count); #endif /* MPI_hpux */ - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); - error_code = MPIOI_File_iwrite(fh, offset, ADIO_EXPLICIT_OFFSET, buf, + error_code = MPIOI_File_iwrite(adio_fh, offset, ADIO_EXPLICIT_OFFSET, buf, count, datatype, myname, request); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); /* --END ERROR HANDLING-- */ #ifdef MPI_hpux - HPMP_IO_END(fl_xmpi, mpi_fh, datatype, count) + HPMP_IO_END(fl_xmpi, fh, datatype, count) #endif /* MPI_hpux */ return error_code; diff --git a/ompi/mca/io/romio/romio/mpi-io/iwrite_sh.c b/ompi/mca/io/romio/romio/mpi-io/iwrite_sh.c index 9812facc40..e0e2b0b8ad 100644 --- a/ompi/mca/io/romio/romio/mpi-io/iwrite_sh.c +++ b/ompi/mca/io/romio/romio/mpi-io/iwrite_sh.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -41,11 +41,11 @@ Output Parameters: #include "mpiu_greq.h" #endif -int MPI_File_iwrite_shared(MPI_File mpi_fh, void *buf, int count, +int MPI_File_iwrite_shared(MPI_File fh, const void *buf, int count, MPI_Datatype datatype, MPIO_Request *request) { int error_code, bufsize, buftype_is_contig, filetype_is_contig; - ADIO_File fh; + ADIO_File adio_fh; int datatype_size, incr; ADIO_Status status; ADIO_Offset off, shared_fp; @@ -53,60 +53,60 @@ int MPI_File_iwrite_shared(MPI_File mpi_fh, void *buf, int count, MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); - MPIO_CHECK_COUNT(fh, count, myname, error_code); - MPIO_CHECK_DATATYPE(fh, datatype, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); + MPIO_CHECK_COUNT(adio_fh, count, myname, error_code); + MPIO_CHECK_DATATYPE(adio_fh, datatype, myname, error_code); /* --END ERROR HANDLING-- */ MPI_Type_size(datatype, &datatype_size); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_INTEGRAL_ETYPE(fh, count, datatype_size, myname, error_code); - MPIO_CHECK_FS_SUPPORTS_SHARED(fh, myname, error_code); - MPIO_CHECK_COUNT_SIZE(fh, count, datatype_size, myname, error_code); + MPIO_CHECK_INTEGRAL_ETYPE(adio_fh, count, datatype_size, myname, error_code); + MPIO_CHECK_FS_SUPPORTS_SHARED(adio_fh, myname, error_code); + MPIO_CHECK_COUNT_SIZE(adio_fh, count, datatype_size, myname, error_code); /* --END ERROR HANDLING-- */ ADIOI_Datatype_iscontig(datatype, &buftype_is_contig); - ADIOI_Datatype_iscontig(fh->filetype, &filetype_is_contig); + ADIOI_Datatype_iscontig(adio_fh->filetype, &filetype_is_contig); - ADIOI_TEST_DEFERRED(fh, myname, &error_code); + ADIOI_TEST_DEFERRED(adio_fh, myname, &error_code); - incr = (count*datatype_size)/fh->etype_size; - ADIO_Get_shared_fp(fh, incr, &shared_fp, &error_code); + incr = (count*datatype_size)/adio_fh->etype_size; + ADIO_Get_shared_fp(adio_fh, incr, &shared_fp, &error_code); if (error_code != MPI_SUCCESS) { /* note: ADIO_Get_shared_fp should have set up error code already? */ - MPIO_Err_return_file(fh, error_code); + MPIO_Err_return_file(adio_fh, error_code); } /* contiguous or strided? */ if (buftype_is_contig && filetype_is_contig) { /* convert sizes to bytes */ bufsize = datatype_size * count; - off = fh->disp + fh->etype_size * shared_fp; - if (!(fh->atomicity)) - ADIO_IwriteContig(fh, buf, count, datatype, ADIO_EXPLICIT_OFFSET, + off = adio_fh->disp + adio_fh->etype_size * shared_fp; + if (!(adio_fh->atomicity)) + ADIO_IwriteContig(adio_fh, buf, count, datatype, ADIO_EXPLICIT_OFFSET, off, request, &error_code); else { /* to maintain strict atomicity semantics with other concurrent operations, lock (exclusive) and call blocking routine */ - if (fh->file_system != ADIO_NFS) - ADIOI_WRITE_LOCK(fh, off, SEEK_SET, bufsize); + if (adio_fh->file_system != ADIO_NFS) + ADIOI_WRITE_LOCK(adio_fh, off, SEEK_SET, bufsize); - ADIO_WriteContig(fh, buf, count, datatype, ADIO_EXPLICIT_OFFSET, + ADIO_WriteContig(adio_fh, buf, count, datatype, ADIO_EXPLICIT_OFFSET, off, &status, &error_code); - if (fh->file_system != ADIO_NFS) - ADIOI_UNLOCK(fh, off, SEEK_SET, bufsize); + if (adio_fh->file_system != ADIO_NFS) + ADIOI_UNLOCK(adio_fh, off, SEEK_SET, bufsize); - MPIO_Completed_request_create(&fh, bufsize, &error_code, request); + MPIO_Completed_request_create(&adio_fh, bufsize, &error_code, request); } } else - ADIO_IwriteStrided(fh, buf, count, datatype, ADIO_EXPLICIT_OFFSET, + ADIO_IwriteStrided(adio_fh, buf, count, datatype, ADIO_EXPLICIT_OFFSET, shared_fp, request, &error_code); fn_exit: diff --git a/ompi/mca/io/romio/romio/mpi-io/mpich_fileutil.c b/ompi/mca/io/romio/romio/mpi-io/mpich_fileutil.c new file mode 100644 index 0000000000..7f35430c70 --- /dev/null +++ b/ompi/mca/io/romio/romio/mpi-io/mpich_fileutil.c @@ -0,0 +1,60 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ +/* + * (C) 2001 by Argonne National Laboratory. + * See COPYRIGHT in top-level directory. + */ +#include "mpioimpl.h" +#include "adio_extern.h" + +#ifdef MPICH + +/* Forward ref for the routine to extract and set the error handler + in a ROMIO File structure. FIXME: These should be imported from a common + header file that is also used in errhan/file_set_errhandler.c + */ +int MPIR_ROMIO_Get_file_errhand( MPI_File, MPI_Errhandler * ); +int MPIR_ROMIO_Set_file_errhand( MPI_File, MPI_Errhandler ); +void MPIR_Get_file_error_routine( MPI_Errhandler, + void (**)(MPI_File *, int *, ...), + int * ); + +/* These next two routines are used to allow MPICH to access/set the + error handers in the MPI_File structure until MPICH knows about the + file structure, and to handle the errhandler structure, which + includes a reference count. Not currently used. */ +int MPIR_ROMIO_Set_file_errhand( MPI_File file_ptr, MPI_Errhandler e ) +{ + if (file_ptr == MPI_FILE_NULL) ADIOI_DFLT_ERR_HANDLER = e; + /* --BEGIN ERROR HANDLING-- */ + else if (file_ptr->cookie != ADIOI_FILE_COOKIE) { + return MPI_ERR_FILE; + } + /* --END ERROR HANDLING-- */ + else + file_ptr->err_handler = e; + return 0; +} +int MPIR_ROMIO_Get_file_errhand( MPI_File file_ptr, MPI_Errhandler *e ) +{ + if (file_ptr == MPI_FILE_NULL) { + if (ADIOI_DFLT_ERR_HANDLER == MPI_ERRORS_RETURN) + *e = 0; + else { + *e = ADIOI_DFLT_ERR_HANDLER; + } + } + /* --BEGIN ERROR HANDLING-- */ + else if (file_ptr->cookie != ADIOI_FILE_COOKIE) { + return MPI_ERR_FILE; + } + /* --END ERROR HANDLING-- */ + else { + if (file_ptr->err_handler == MPI_ERRORS_RETURN) + *e = 0; + else + *e = file_ptr->err_handler; + } + return 0; +} + +#endif /* MPICH */ diff --git a/ompi/mca/io/romio/romio/mpi-io/mpioimpl.h b/ompi/mca/io/romio/romio/mpi-io/mpioimpl.h index e809d4ab3b..3c661bb157 100644 --- a/ompi/mca/io/romio/romio/mpi-io/mpioimpl.h +++ b/ompi/mca/io/romio/romio/mpi-io/mpioimpl.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -14,26 +14,38 @@ #include "adio.h" #include "mpio.h" +#include "mpiu_external32.h" -/* FIXME: We should be more restricted in what we include from MPICH2 - into ROMIO */ -#ifdef ROMIO_INSIDE_MPICH2 -#include "mpiimpl.h" -#include "mpiimplthread.h" +#ifdef ROMIO_INSIDE_MPICH +#include "glue_romio.h" -#else /* not ROMIO_INSIDE_MPICH2 */ +#define MPIU_THREAD_CS_ENTER(name_,ctx_) MPIU_THREAD_CS_ENTER_##name_(ctx_) +#define MPIU_THREAD_CS_EXIT(name_,ctx_) MPIU_THREAD_CS_EXIT_##name_(ctx_) +#define MPIU_THREAD_CS_ENTER_ALLFUNC(ctx_) MPIR_Ext_cs_enter_allfunc() +#define MPIU_THREAD_CS_EXIT_ALLFUNC(ctx_) MPIR_Ext_cs_exit_allfunc() + +/* committed datatype checking support in ROMIO */ +#define MPIO_DATATYPE_ISCOMMITTED(dtype_, err_) \ + do { \ + err_ = MPIR_Ext_datatype_iscommitted(dtype_); \ + } while (0) + +#else /* not ROMIO_INSIDE_MPICH */ /* Any MPI implementation that wishes to follow the thread-safety and - error reporting features provided by MPICH2 must implement these + error reporting features provided by MPICH must implement these four functions. Defining these as empty should not change the behavior of correct programs */ #define MPIU_THREAD_CS_ENTER(x,y) #define MPIU_THREAD_CS_EXIT(x,y) +/* Open MPI: need to set err_ or else the datatype check will fail due to an + * uninitialized value. */ +#define MPIO_DATATYPE_ISCOMMITTED(dtype_, err_) do {err_ = MPI_SUCCESS;} while (0) #ifdef HAVE_WINDOWS_H #define MPIU_UNREFERENCED_ARG(a) a #else #define MPIU_UNREFERENCED_ARG(a) #endif -#endif /* ROMIO_INSIDE_MPICH2 */ +#endif /* ROMIO_INSIDE_MPICH */ /* info is a linked list of these structures */ struct MPIR_Info { diff --git a/ompi/mca/io/romio/romio/mpi-io/mpioprof.h b/ompi/mca/io/romio/romio/mpi-io/mpioprof.h index 3cd568037c..108fd6441e 100644 --- a/ompi/mca/io/romio/romio/mpi-io/mpioprof.h +++ b/ompi/mca/io/romio/romio/mpi-io/mpioprof.h @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/mpir-mpioinit.c b/ompi/mca/io/romio/romio/mpi-io/mpir-mpioinit.c index d4d2cf877e..be78b45e98 100644 --- a/ompi/mca/io/romio/romio/mpi-io/mpir-mpioinit.c +++ b/ompi/mca/io/romio/romio/mpi-io/mpir-mpioinit.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2009 UChicago/Argonne LLC * See COPYRIGHT in top-level directory. diff --git a/ompi/mca/io/romio/romio/mpi-io/mpiu_external32.c b/ompi/mca/io/romio/romio/mpi-io/mpiu_external32.c new file mode 100644 index 0000000000..3644717869 --- /dev/null +++ b/ompi/mca/io/romio/romio/mpi-io/mpiu_external32.c @@ -0,0 +1,163 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ +/* (C) 2012 by Argonne National Laboratory. + * See COPYRIGHT in top-level directory. + */ + +#include "mpioimpl.h" +#include "mpiu_external32.h" + +#ifdef HAVE_WEAK_SYMBOLS +/* Include mapping from MPI->PMPI */ +#define MPIO_BUILD_PROFILING +#include "mpioprof.h" +#endif + +int MPIU_write_external32_conversion_fn (const void *userbuf, MPI_Datatype datatype, + int count, void *filebuf) +{ + int position_i = 0; + MPI_Aint position = 0; + MPI_Aint bytes = 0; + int mpi_errno = MPI_SUCCESS; + int is_contig = 0; + + ADIOI_Datatype_iscontig(datatype, &is_contig); + mpi_errno = MPI_Pack_external_size("external32", count, datatype, &bytes); + if (mpi_errno != MPI_SUCCESS) + goto fn_exit; + + if (is_contig) + { + mpi_errno = MPI_Pack_external("external32", userbuf, count, + datatype, filebuf, bytes, &position); + if (mpi_errno != MPI_SUCCESS) + goto fn_exit; + } + else + { + void *tmp_buf = NULL; + tmp_buf = ADIOI_Malloc(bytes); + if (!tmp_buf) + { + mpi_errno = MPI_ERR_NO_MEM; + goto fn_exit; + } + + mpi_errno = MPI_Pack_external("external32", userbuf, count, + datatype, tmp_buf, bytes, &position); + if (mpi_errno != MPI_SUCCESS) + { + ADIOI_Free(tmp_buf); + goto fn_exit; + } + + mpi_errno = MPI_Unpack(tmp_buf, bytes, &position_i, filebuf, count, + datatype, MPI_COMM_WORLD); + if (mpi_errno != MPI_SUCCESS) + { + ADIOI_Free(tmp_buf); + goto fn_exit; + } + + ADIOI_Free(tmp_buf); + } +fn_exit: + return mpi_errno; +} + +int MPIU_read_external32_conversion_fn(void *userbuf, MPI_Datatype datatype, + int count, void *filebuf) +{ + int position_i = 0; + MPI_Aint position = 0; + MPI_Aint bytes = 0; + int mpi_errno = MPI_SUCCESS; + int is_contig = 0; + + ADIOI_Datatype_iscontig(datatype, &is_contig); + mpi_errno = MPI_Pack_external_size("external32", count, datatype, &bytes); + if (mpi_errno != MPI_SUCCESS) + goto fn_exit; + + if (is_contig) + { + mpi_errno = MPI_Unpack_external("external32", filebuf, bytes, + &position, userbuf, count, datatype); + if (mpi_errno != MPI_SUCCESS) + goto fn_exit; + } + else + { + void *tmp_buf = NULL; + tmp_buf = ADIOI_Malloc(bytes); + if (!tmp_buf) + { + mpi_errno = MPI_ERR_NO_MEM; + goto fn_exit; + } + + mpi_errno = MPI_Pack(filebuf, count, datatype, tmp_buf, bytes, + &position_i, MPI_COMM_WORLD); + if (mpi_errno != MPI_SUCCESS) + { + ADIOI_Free(tmp_buf); + goto fn_exit; + } + + mpi_errno = MPI_Unpack_external("external32", tmp_buf, bytes, + &position, userbuf, count, datatype); + if (mpi_errno != MPI_SUCCESS) + { + ADIOI_Free(tmp_buf); + goto fn_exit; + } + + ADIOI_Free(tmp_buf); + } +fn_exit: + return mpi_errno; +} +int MPIU_datatype_full_size(MPI_Datatype datatype, MPI_Aint *size) +{ + int error_code = MPI_SUCCESS; + MPI_Aint extent = 0; + MPI_Aint true_extent = 0; + MPI_Aint true_lb = 0; + + error_code = MPI_Type_get_true_extent(datatype, &true_lb, &true_extent); + if (error_code != MPI_SUCCESS) + goto fn_exit; + + *size = true_extent; +fn_exit: + return error_code; +} + +/* given a buffer, count, and datatype, return an apropriately allocated, sized + * and external32-formatted buffer, suitable for handing off to a subsequent + * write routine. Caller is responsible for freeing 'newbuf' */ +int MPIU_external32_buffer_setup(const void * buf, int count, MPI_Datatype type, void **newbuf) +{ + + MPI_Aint datatype_size=0, bytes=0; + int error_code; + + error_code = MPIU_datatype_full_size(type, &datatype_size); + if (error_code != MPI_SUCCESS) + return error_code; + + bytes = datatype_size * count; + *newbuf = ADIOI_Malloc(bytes); + + error_code = MPIU_write_external32_conversion_fn(buf, type, count, *newbuf); + if (error_code != MPI_SUCCESS) { + ADIOI_Free(newbuf); + return error_code; + } + return MPI_SUCCESS; +} + + +/* + * vim: ts=8 sts=4 sw=4 noexpandtab + */ diff --git a/ompi/mca/io/romio/romio/mpi-io/mpiu_greq.c b/ompi/mca/io/romio/romio/mpi-io/mpiu_greq.c index e460fee8d1..cb6e9d2ed4 100644 --- a/ompi/mca/io/romio/romio/mpi-io/mpiu_greq.c +++ b/ompi/mca/io/romio/romio/mpi-io/mpiu_greq.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2003 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. diff --git a/ompi/mca/io/romio/romio/mpi-io/open.c b/ompi/mca/io/romio/romio/mpi-io/open.c index 2d1bf996c2..14c025c23e 100644 --- a/ompi/mca/io/romio/romio/mpi-io/open.c +++ b/ompi/mca/io/romio/romio/mpi-io/open.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -43,10 +43,10 @@ Output Parameters: .N fortran @*/ -int MPI_File_open(MPI_Comm comm, char *filename, int amode, +int MPI_File_open(MPI_Comm comm, const char *filename, int amode, MPI_Info info, MPI_File *fh) { - int error_code, file_system, flag, tmp_amode=0, rank; + int error_code = MPI_SUCCESS, file_system, flag, tmp_amode=0, rank; char *tmp; MPI_Comm dupcomm; ADIOI_Fns *fsops; @@ -60,20 +60,16 @@ int MPI_File_open(MPI_Comm comm, char *filename, int amode, MPIU_THREAD_CS_ENTER(ALLFUNC,); /* --BEGIN ERROR HANDLING-- */ - if (comm == MPI_COMM_NULL) - { - error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, - myname, __LINE__, MPI_ERR_COMM, - "**comm", 0); - goto fn_fail; - } + MPIO_CHECK_COMM(comm, myname, error_code); + if(info != MPI_INFO_NULL) + MPIO_CHECK_INFO(info, error_code); /* --END ERROR HANDLING-- */ - MPI_Comm_test_inter(comm, &flag); + error_code = MPI_Comm_test_inter(comm, &flag); /* --BEGIN ERROR HANDLING-- */ - if (flag) + if (error_code || flag) { - error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, + error_code = MPIO_Err_create_code(error_code, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_COMM, "**commnotintra", 0); goto fn_fail; @@ -116,7 +112,7 @@ int MPI_File_open(MPI_Comm comm, char *filename, int amode, if (tmp_amode == ADIO_AMODE_NOMATCH) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, - myname, __LINE__, MPI_ERR_AMODE, + myname, __LINE__, MPI_ERR_NOT_SAME, "**fileamodediff", 0); goto fn_fail; } diff --git a/ompi/mca/io/romio/romio/mpi-io/prealloc.c b/ompi/mca/io/romio/romio/mpi-io/prealloc.c index 620a6c78e4..9e5d2c6d84 100644 --- a/ompi/mca/io/romio/romio/mpi-io/prealloc.c +++ b/ompi/mca/io/romio/romio/mpi-io/prealloc.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -32,66 +32,67 @@ Input Parameters: .N fortran @*/ -int MPI_File_preallocate(MPI_File mpi_fh, MPI_Offset size) +int MPI_File_preallocate(MPI_File fh, MPI_Offset size) { ADIO_Fcntl_t *fcntl_struct; int error_code=0, mynod=0; - ADIO_File fh; + ADIO_File adio_fh; static char myname[] = "MPI_FILE_PREALLOCATE"; - MPI_Offset tmp_sz; + MPI_Offset tmp_sz, max_sz, min_sz; #ifdef MPI_hpux int fl_xmpi; HPMP_IO_START(fl_xmpi, BLKMPIFILEPREALLOCATE, TRDTBLOCK, - fh, MPI_DATATYPE_NULL, -1); + adio_fh, MPI_DATATYPE_NULL, -1); #endif /* MPI_hpux */ MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); if (size < 0) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**iobadsize", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } tmp_sz = size; - MPI_Bcast(&tmp_sz, 1, ADIO_OFFSET, 0, fh->comm); + MPI_Allreduce(&tmp_sz, &max_sz, 1, ADIO_OFFSET, MPI_MAX, adio_fh->comm); + MPI_Allreduce(&tmp_sz, &min_sz, 1, ADIO_OFFSET, MPI_MIN, adio_fh->comm); - if (tmp_sz != size) { + if (max_sz != min_sz) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**notsame", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ if (size == 0) goto fn_exit; - ADIOI_TEST_DEFERRED(fh, myname, &error_code); + ADIOI_TEST_DEFERRED(adio_fh, myname, &error_code); - MPI_Comm_rank(fh->comm, &mynod); + MPI_Comm_rank(adio_fh->comm, &mynod); if (!mynod) { fcntl_struct = (ADIO_Fcntl_t *) ADIOI_Malloc(sizeof(ADIO_Fcntl_t)); fcntl_struct->diskspace = size; - ADIO_Fcntl(fh, ADIO_FCNTL_SET_DISKSPACE, fcntl_struct, &error_code); + ADIO_Fcntl(adio_fh, ADIO_FCNTL_SET_DISKSPACE, fcntl_struct, &error_code); ADIOI_Free(fcntl_struct); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); /* --END ERROR HANDLING-- */ } - MPI_Barrier(fh->comm); + MPI_Barrier(adio_fh->comm); #ifdef MPI_hpux - HPMP_IO_END(fl_xmpi, fh, MPI_DATATYPE_NULL, -1); + HPMP_IO_END(fl_xmpi, adio_fh, MPI_DATATYPE_NULL, -1); #endif /* MPI_hpux */ diff --git a/ompi/mca/io/romio/romio/mpi-io/rd_atallb.c b/ompi/mca/io/romio/romio/mpi-io/rd_atallb.c index 901c50cab3..44f54e4bda 100644 --- a/ompi/mca/io/romio/romio/mpi-io/rd_atallb.c +++ b/ompi/mca/io/romio/romio/mpi-io/rd_atallb.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -24,7 +24,7 @@ #endif /*@ - MPI_File_read_at_all_begin - Begin a split collective read using explict offset + MPI_File_read_at_all_begin - Begin a split collective read using explicit offset Input Parameters: . fh - file handle (handle) @@ -37,13 +37,13 @@ Output Parameters: .N fortran @*/ -int MPI_File_read_at_all_begin(MPI_File mpi_fh, MPI_Offset offset, void *buf, +int MPI_File_read_at_all_begin(MPI_File fh, MPI_Offset offset, void *buf, int count, MPI_Datatype datatype) { int error_code; static char myname[] = "MPI_FILE_READ_AT_ALL_BEGIN"; - error_code = MPIOI_File_read_all_begin(mpi_fh, offset, + error_code = MPIOI_File_read_all_begin(fh, offset, ADIO_EXPLICIT_OFFSET, buf, count, datatype, myname); diff --git a/ompi/mca/io/romio/romio/mpi-io/rd_atalle.c b/ompi/mca/io/romio/romio/mpi-io/rd_atalle.c index cdb1df61d2..0715e6a946 100644 --- a/ompi/mca/io/romio/romio/mpi-io/rd_atalle.c +++ b/ompi/mca/io/romio/romio/mpi-io/rd_atalle.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -25,7 +25,7 @@ /*@ MPI_File_read_at_all_end - Complete a split collective read using - explict offset + explicit offset Input Parameters: . fh - file handle (handle) @@ -36,13 +36,13 @@ Output Parameters: .N fortran @*/ -int MPI_File_read_at_all_end(MPI_File mpi_fh, void *buf, MPI_Status *status) +int MPI_File_read_at_all_end(MPI_File fh, void *buf, MPI_Status *status) { int error_code; static char myname[] = "MPI_FILE_READ_AT_ALL_END"; - error_code = MPIOI_File_read_all_end(mpi_fh, buf, myname, status); + error_code = MPIOI_File_read_all_end(fh, buf, myname, status); return error_code; } diff --git a/ompi/mca/io/romio/romio/mpi-io/read.c b/ompi/mca/io/romio/romio/mpi-io/read.c index 74a6db7a22..029db3b645 100644 --- a/ompi/mca/io/romio/romio/mpi-io/read.c +++ b/ompi/mca/io/romio/romio/mpi-io/read.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. @@ -38,7 +38,7 @@ Output Parameters: .N fortran @*/ -int MPI_File_read(MPI_File mpi_fh, void *buf, int count, +int MPI_File_read(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPI_Status *status) { int error_code; @@ -46,14 +46,14 @@ int MPI_File_read(MPI_File mpi_fh, void *buf, int count, #ifdef MPI_hpux int fl_xmpi; - HPMP_IO_START(fl_xmpi, BLKMPIFILEREAD, TRDTBLOCK, mpi_fh, datatype, count); + HPMP_IO_START(fl_xmpi, BLKMPIFILEREAD, TRDTBLOCK, fh, datatype, count); #endif /* MPI_hpux */ - error_code = MPIOI_File_read(mpi_fh, (MPI_Offset) 0, ADIO_INDIVIDUAL, buf, + error_code = MPIOI_File_read(fh, (MPI_Offset) 0, ADIO_INDIVIDUAL, buf, count, datatype, myname, status); #ifdef MPI_hpux - HPMP_IO_END(fl_xmpi, mpi_fh, datatype, count); + HPMP_IO_END(fl_xmpi, fh, datatype, count); #endif /* MPI_hpux */ return error_code; @@ -61,7 +61,7 @@ int MPI_File_read(MPI_File mpi_fh, void *buf, int count, /* prevent multiple definitions of this routine */ #ifdef MPIO_BUILD_PROFILING -int MPIOI_File_read(MPI_File mpi_fh, +int MPIOI_File_read(MPI_File fh, MPI_Offset offset, int file_ptr_type, void *buf, @@ -72,24 +72,25 @@ int MPIOI_File_read(MPI_File mpi_fh, { int error_code, bufsize, buftype_is_contig, filetype_is_contig; int datatype_size; - ADIO_File fh; + ADIO_File adio_fh; ADIO_Offset off; + void *xbuf=NULL, *e32_buf=NULL; MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); - MPIO_CHECK_COUNT(fh, count, myname, error_code); - MPIO_CHECK_DATATYPE(fh, datatype, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); + MPIO_CHECK_COUNT(adio_fh, count, myname, error_code); + MPIO_CHECK_DATATYPE(adio_fh, datatype, myname, error_code); if (file_ptr_type == ADIO_EXPLICIT_OFFSET && offset < 0) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**iobadoffset", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ @@ -97,7 +98,7 @@ int MPIOI_File_read(MPI_File mpi_fh, MPI_Type_size(datatype, &datatype_size); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_COUNT_SIZE(fh, count, datatype_size, myname, error_code); + MPIO_CHECK_COUNT_SIZE(adio_fh, count, datatype_size, myname, error_code); /* --END ERROR HANDLING-- */ if (count*datatype_size == 0) @@ -110,51 +111,71 @@ int MPIOI_File_read(MPI_File mpi_fh, } /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_INTEGRAL_ETYPE(fh, count, datatype_size, myname, error_code); - MPIO_CHECK_READABLE(fh, myname, error_code); - MPIO_CHECK_NOT_SEQUENTIAL_MODE(fh, myname, error_code); + MPIO_CHECK_INTEGRAL_ETYPE(adio_fh, count, datatype_size, myname, error_code); + MPIO_CHECK_READABLE(adio_fh, myname, error_code); + MPIO_CHECK_NOT_SEQUENTIAL_MODE(adio_fh, myname, error_code); /* --END ERROR HANDLING-- */ ADIOI_Datatype_iscontig(datatype, &buftype_is_contig); - ADIOI_Datatype_iscontig(fh->filetype, &filetype_is_contig); + ADIOI_Datatype_iscontig(adio_fh->filetype, &filetype_is_contig); - ADIOI_TEST_DEFERRED(fh, myname, &error_code); + ADIOI_TEST_DEFERRED(adio_fh, myname, &error_code); + + xbuf = buf; + if (adio_fh->is_external32) + { + MPI_Aint e32_size = 0; + error_code = MPIU_datatype_full_size(datatype, &e32_size); + if (error_code != MPI_SUCCESS) + goto fn_exit; + + e32_buf = ADIOI_Malloc(e32_size*count); + xbuf = e32_buf; + } if (buftype_is_contig && filetype_is_contig) { /* convert count and offset to bytes */ bufsize = datatype_size * count; if (file_ptr_type == ADIO_EXPLICIT_OFFSET) { - off = fh->disp + fh->etype_size * offset; + off = adio_fh->disp + adio_fh->etype_size * offset; } else /* ADIO_INDIVIDUAL */ { - off = fh->fp_ind; + off = adio_fh->fp_ind; } /* if atomic mode requested, lock (exclusive) the region, because there could be a concurrent noncontiguous request. */ - if ((fh->atomicity) && ADIO_Feature(fh, ADIO_LOCKS)) - ADIOI_WRITE_LOCK(fh, off, SEEK_SET, bufsize); + if ((adio_fh->atomicity) && ADIO_Feature(adio_fh, ADIO_LOCKS)) { + ADIOI_WRITE_LOCK(adio_fh, off, SEEK_SET, bufsize); + } - ADIO_ReadContig(fh, buf, count, datatype, file_ptr_type, + ADIO_ReadContig(adio_fh, xbuf, count, datatype, file_ptr_type, off, status, &error_code); - if ((fh->atomicity) && ADIO_Feature(fh, ADIO_LOCKS)) - ADIOI_UNLOCK(fh, off, SEEK_SET, bufsize); + if ((adio_fh->atomicity) && ADIO_Feature(adio_fh, ADIO_LOCKS)) { + ADIOI_UNLOCK(adio_fh, off, SEEK_SET, bufsize); + } } else { - ADIO_ReadStrided(fh, buf, count, datatype, file_ptr_type, + ADIO_ReadStrided(adio_fh, xbuf, count, datatype, file_ptr_type, offset, status, &error_code); /* For strided and atomic mode, locking is done in ADIO_ReadStrided */ } /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); /* --END ERROR HANDLING-- */ + if (e32_buf != NULL) { + error_code = MPIU_read_external32_conversion_fn(xbuf, datatype, + count, e32_buf); + ADIOI_Free(e32_buf); + } + fn_exit: MPIU_THREAD_CS_EXIT(ALLFUNC,); diff --git a/ompi/mca/io/romio/romio/mpi-io/read_all.c b/ompi/mca/io/romio/romio/mpi-io/read_all.c index 2ce9f22d40..b387fe9cdf 100644 --- a/ompi/mca/io/romio/romio/mpi-io/read_all.c +++ b/ompi/mca/io/romio/romio/mpi-io/read_all.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. @@ -38,7 +38,7 @@ Output Parameters: .N fortran @*/ -int MPI_File_read_all(MPI_File mpi_fh, void *buf, int count, +int MPI_File_read_all(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPI_Status *status) { int error_code; @@ -49,7 +49,7 @@ int MPI_File_read_all(MPI_File mpi_fh, void *buf, int count, HPMP_IO_START(fl_xmpi, BLKMPIFILEREADALL, TRDTBLOCK, fh, datatype, count); #endif /* MPI_hpux */ - error_code = MPIOI_File_read_all(mpi_fh, (MPI_Offset) 0, + error_code = MPIOI_File_read_all(fh, (MPI_Offset) 0, ADIO_INDIVIDUAL, buf, count, datatype, myname, status); @@ -63,7 +63,7 @@ int MPI_File_read_all(MPI_File mpi_fh, void *buf, int count, /* Note: MPIOI_File_read_all also used by MPI_File_read_at_all */ /* prevent multiple definitions of this routine */ #ifdef MPIO_BUILD_PROFILING -int MPIOI_File_read_all(MPI_File mpi_fh, +int MPIOI_File_read_all(MPI_File fh, MPI_Offset offset, int file_ptr_type, void *buf, @@ -73,23 +73,24 @@ int MPIOI_File_read_all(MPI_File mpi_fh, MPI_Status *status) { int error_code, datatype_size; - ADIO_File fh; + ADIO_File adio_fh; + void *xbuf=NULL, *e32_buf=NULL; MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); - MPIO_CHECK_COUNT(fh, count, myname, error_code); - MPIO_CHECK_DATATYPE(fh, datatype, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); + MPIO_CHECK_COUNT(adio_fh, count, myname, error_code); + MPIO_CHECK_DATATYPE(adio_fh, datatype, myname, error_code); if (file_ptr_type == ADIO_EXPLICIT_OFFSET && offset < 0) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**iobadoffset", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ @@ -97,20 +98,38 @@ int MPIOI_File_read_all(MPI_File mpi_fh, MPI_Type_size(datatype, &datatype_size); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_INTEGRAL_ETYPE(fh, count, datatype_size, myname, error_code); - MPIO_CHECK_READABLE(fh, myname, error_code); - MPIO_CHECK_NOT_SEQUENTIAL_MODE(fh, myname, error_code); - MPIO_CHECK_COUNT_SIZE(fh, count, datatype_size, myname, error_code); + MPIO_CHECK_INTEGRAL_ETYPE(adio_fh, count, datatype_size, myname, error_code); + MPIO_CHECK_READABLE(adio_fh, myname, error_code); + MPIO_CHECK_NOT_SEQUENTIAL_MODE(adio_fh, myname, error_code); + MPIO_CHECK_COUNT_SIZE(adio_fh, count, datatype_size, myname, error_code); /* --END ERROR HANDLING-- */ - ADIO_ReadStridedColl(fh, buf, count, datatype, file_ptr_type, + xbuf = buf; + if (adio_fh->is_external32) + { + MPI_Aint e32_size = 0; + error_code = MPIU_datatype_full_size(datatype, &e32_size); + if (error_code != MPI_SUCCESS) + goto fn_exit; + + e32_buf = ADIOI_Malloc(e32_size*count); + xbuf = e32_buf; + } + + ADIO_ReadStridedColl(adio_fh, xbuf, count, datatype, file_ptr_type, offset, status, &error_code); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); /* --END ERROR HANDLING-- */ + if (e32_buf != NULL) { + error_code = MPIU_read_external32_conversion_fn(xbuf, datatype, + count, e32_buf); + ADIOI_Free(e32_buf); + } + fn_exit: MPIU_THREAD_CS_EXIT(ALLFUNC,); diff --git a/ompi/mca/io/romio/romio/mpi-io/read_allb.c b/ompi/mca/io/romio/romio/mpi-io/read_allb.c index d1a5bb59ae..ecc908872f 100644 --- a/ompi/mca/io/romio/romio/mpi-io/read_allb.c +++ b/ompi/mca/io/romio/romio/mpi-io/read_allb.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -36,13 +36,13 @@ Output Parameters: .N fortran @*/ -int MPI_File_read_all_begin(MPI_File mpi_fh, void *buf, int count, +int MPI_File_read_all_begin(MPI_File fh, void *buf, int count, MPI_Datatype datatype) { int error_code; static char myname[] = "MPI_FILE_READ_ALL_BEGIN"; - error_code = MPIOI_File_read_all_begin(mpi_fh, (MPI_Offset) 0, + error_code = MPIOI_File_read_all_begin(fh, (MPI_Offset) 0, ADIO_INDIVIDUAL, buf, count, datatype, myname); @@ -51,7 +51,7 @@ int MPI_File_read_all_begin(MPI_File mpi_fh, void *buf, int count, /* prevent multiple definitions of this routine */ #ifdef MPIO_BUILD_PROFILING -int MPIOI_File_read_all_begin(MPI_File mpi_fh, +int MPIOI_File_read_all_begin(MPI_File fh, MPI_Offset offset, int file_ptr_type, void *buf, @@ -60,23 +60,24 @@ int MPIOI_File_read_all_begin(MPI_File mpi_fh, char *myname) { int error_code, datatype_size; - ADIO_File fh; + ADIO_File adio_fh; + void *xbuf=NULL, *e32_buf=NULL; MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); - MPIO_CHECK_COUNT(fh, count, myname, error_code); - MPIO_CHECK_DATATYPE(fh, datatype, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); + MPIO_CHECK_COUNT(adio_fh, count, myname, error_code); + MPIO_CHECK_DATATYPE(adio_fh, datatype, myname, error_code); if (file_ptr_type == ADIO_EXPLICIT_OFFSET && offset < 0) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**iobadoffset", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ @@ -84,30 +85,48 @@ int MPIOI_File_read_all_begin(MPI_File mpi_fh, MPI_Type_size(datatype, &datatype_size); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_INTEGRAL_ETYPE(fh, count, datatype_size, myname, error_code); - MPIO_CHECK_READABLE(fh, myname, error_code); - MPIO_CHECK_NOT_SEQUENTIAL_MODE(fh, myname, error_code); + MPIO_CHECK_INTEGRAL_ETYPE(adio_fh, count, datatype_size, myname, error_code); + MPIO_CHECK_READABLE(adio_fh, myname, error_code); + MPIO_CHECK_NOT_SEQUENTIAL_MODE(adio_fh, myname, error_code); - if (fh->split_coll_count) { + if (adio_fh->split_coll_count) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_IO, "**iosplitcoll", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } - MPIO_CHECK_COUNT_SIZE(fh, count, datatype_size, myname, error_code); + MPIO_CHECK_COUNT_SIZE(adio_fh, count, datatype_size, myname, error_code); /* --END ERROR HANDLING-- */ - fh->split_coll_count = 1; + adio_fh->split_coll_count = 1; - ADIO_ReadStridedColl(fh, buf, count, datatype, file_ptr_type, - offset, &fh->split_status, &error_code); + xbuf = buf; + if (adio_fh->is_external32) + { + MPI_Aint e32_size = 0; + error_code = MPIU_datatype_full_size(datatype, &e32_size); + if (error_code != MPI_SUCCESS) + goto fn_exit; + + e32_buf = ADIOI_Malloc(e32_size*count); + xbuf = e32_buf; + } + + ADIO_ReadStridedColl(adio_fh, xbuf, count, datatype, file_ptr_type, + offset, &adio_fh->split_status, &error_code); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); /* --END ERROR HANDLING-- */ + if (e32_buf != NULL) { + error_code = MPIU_read_external32_conversion_fn(xbuf, datatype, + count, e32_buf); + ADIOI_Free(e32_buf); + } + fn_exit: MPIU_THREAD_CS_EXIT(ALLFUNC,); diff --git a/ompi/mca/io/romio/romio/mpi-io/read_alle.c b/ompi/mca/io/romio/romio/mpi-io/read_alle.c index d7ff4627fe..820cab6855 100644 --- a/ompi/mca/io/romio/romio/mpi-io/read_alle.c +++ b/ompi/mca/io/romio/romio/mpi-io/read_alle.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -36,53 +36,53 @@ Output Parameters: .N fortran @*/ -int MPI_File_read_all_end(MPI_File mpi_fh, void *buf, MPI_Status *status) +int MPI_File_read_all_end(MPI_File fh, void *buf, MPI_Status *status) { int error_code; static char myname[] = "MPI_FILE_IREAD"; - error_code = MPIOI_File_read_all_end(mpi_fh, buf, myname, status); + error_code = MPIOI_File_read_all_end(fh, buf, myname, status); return error_code; } /* prevent multiple definitions of this routine */ #ifdef MPIO_BUILD_PROFILING -int MPIOI_File_read_all_end(MPI_File mpi_fh, +int MPIOI_File_read_all_end(MPI_File fh, void *buf, char *myname, MPI_Status *status) { - int error_code; - ADIO_File fh; + int error_code = MPI_SUCCESS; + ADIO_File adio_fh; MPIU_UNREFERENCED_ARG(buf); MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); - if (!(fh->split_coll_count)) { + if (!(adio_fh->split_coll_count)) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_IO, "**iosplitcollnone", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ #ifdef HAVE_STATUS_SET_BYTES if (status != MPI_STATUS_IGNORE) - *status = fh->split_status; + *status = adio_fh->split_status; #endif - fh->split_coll_count = 0; + adio_fh->split_coll_count = 0; fn_exit: MPIU_THREAD_CS_EXIT(ALLFUNC,); - return MPI_SUCCESS; + return error_code; } #endif diff --git a/ompi/mca/io/romio/romio/mpi-io/read_at.c b/ompi/mca/io/romio/romio/mpi-io/read_at.c index d30e97ea52..72e593d3ef 100644 --- a/ompi/mca/io/romio/romio/mpi-io/read_at.c +++ b/ompi/mca/io/romio/romio/mpi-io/read_at.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. @@ -25,7 +25,7 @@ /* status object not filled currently */ /*@ - MPI_File_read_at - Read using explict offset + MPI_File_read_at - Read using explicit offset Input Parameters: . fh - file handle (handle) @@ -39,7 +39,7 @@ Output Parameters: .N fortran @*/ -int MPI_File_read_at(MPI_File mpi_fh, MPI_Offset offset, void *buf, +int MPI_File_read_at(MPI_File fh, MPI_Offset offset, void *buf, int count, MPI_Datatype datatype, MPI_Status *status) { int error_code; @@ -47,16 +47,16 @@ int MPI_File_read_at(MPI_File mpi_fh, MPI_Offset offset, void *buf, #ifdef MPI_hpux int fl_xmpi; - HPMP_IO_START(fl_xmpi, BLKMPIFILEREADAT, TRDTBLOCK, mpi_fh, datatype, + HPMP_IO_START(fl_xmpi, BLKMPIFILEREADAT, TRDTBLOCK, fh, datatype, count); #endif /* MPI_hpux */ /* ADIOI_File_read() defined in mpi-io/read.c */ - error_code = MPIOI_File_read(mpi_fh, offset, ADIO_EXPLICIT_OFFSET, buf, + error_code = MPIOI_File_read(fh, offset, ADIO_EXPLICIT_OFFSET, buf, count, datatype, myname, status); #ifdef MPI_hpux - HPMP_IO_END(fl_xmpi, mpi_fh, datatype, count); + HPMP_IO_END(fl_xmpi, fh, datatype, count); #endif /* MPI_hpux */ return error_code; diff --git a/ompi/mca/io/romio/romio/mpi-io/read_atall.c b/ompi/mca/io/romio/romio/mpi-io/read_atall.c index 9ff3bcf9c5..13932b114e 100644 --- a/ompi/mca/io/romio/romio/mpi-io/read_atall.c +++ b/ompi/mca/io/romio/romio/mpi-io/read_atall.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -26,7 +26,7 @@ /* status object not filled currently */ /*@ - MPI_File_read_at_all - Collective read using explict offset + MPI_File_read_at_all - Collective read using explicit offset Input Parameters: . fh - file handle (handle) @@ -40,7 +40,7 @@ Output Parameters: .N fortran @*/ -int MPI_File_read_at_all(MPI_File mpi_fh, MPI_Offset offset, void *buf, +int MPI_File_read_at_all(MPI_File fh, MPI_Offset offset, void *buf, int count, MPI_Datatype datatype, MPI_Status *status) { @@ -49,15 +49,15 @@ int MPI_File_read_at_all(MPI_File mpi_fh, MPI_Offset offset, void *buf, #ifdef MPI_hpux int fl_xmpi; - HPMP_IO_START(fl_xmpi, BLKMPIFILEREADATALL, TRDTBLOCK, mpi_fh, datatype, + HPMP_IO_START(fl_xmpi, BLKMPIFILEREADATALL, TRDTBLOCK, fh, datatype, count); #endif /* MPI_hpux */ - error_code = MPIOI_File_read_all(mpi_fh, offset, ADIO_EXPLICIT_OFFSET, buf, + error_code = MPIOI_File_read_all(fh, offset, ADIO_EXPLICIT_OFFSET, buf, count, datatype, myname, status); #ifdef MPI_hpux - HPMP_IO_END(fl_xmpi, mpi_fh, datatype, count); + HPMP_IO_END(fl_xmpi, fh, datatype, count); #endif /* MPI_hpux */ return error_code; diff --git a/ompi/mca/io/romio/romio/mpi-io/read_ord.c b/ompi/mca/io/romio/romio/mpi-io/read_ord.c index 41993cb55f..dc2573b8b4 100644 --- a/ompi/mca/io/romio/romio/mpi-io/read_ord.c +++ b/ompi/mca/io/romio/romio/mpi-io/read_ord.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -39,63 +39,63 @@ Output Parameters: .N fortran @*/ -int MPI_File_read_ordered(MPI_File mpi_fh, void *buf, int count, +int MPI_File_read_ordered(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPI_Status *status) { int error_code, datatype_size, nprocs, myrank, incr; int source, dest; static char myname[] = "MPI_FILE_READ_ORDERED"; ADIO_Offset shared_fp=0; - ADIO_File fh; + ADIO_File adio_fh; MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); - MPIO_CHECK_COUNT(fh, count, myname, error_code); - MPIO_CHECK_DATATYPE(fh, datatype, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); + MPIO_CHECK_COUNT(adio_fh, count, myname, error_code); + MPIO_CHECK_DATATYPE(adio_fh, datatype, myname, error_code); /* --END ERROR HANDLING-- */ MPI_Type_size(datatype, &datatype_size); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_INTEGRAL_ETYPE(fh, count, datatype_size, myname, error_code); - MPIO_CHECK_FS_SUPPORTS_SHARED(fh, myname, error_code); - MPIO_CHECK_COUNT_SIZE(fh, count, datatype_size, myname, error_code); + MPIO_CHECK_INTEGRAL_ETYPE(adio_fh, count, datatype_size, myname, error_code); + MPIO_CHECK_FS_SUPPORTS_SHARED(adio_fh, myname, error_code); + MPIO_CHECK_COUNT_SIZE(adio_fh, count, datatype_size, myname, error_code); /* --END ERROR HANDLING-- */ - ADIOI_TEST_DEFERRED(fh, "MPI_File_read_ordered", &error_code); + ADIOI_TEST_DEFERRED(adio_fh, "MPI_File_read_ordered", &error_code); - MPI_Comm_size(fh->comm, &nprocs); - MPI_Comm_rank(fh->comm, &myrank); + MPI_Comm_size(adio_fh->comm, &nprocs); + MPI_Comm_rank(adio_fh->comm, &myrank); - incr = (count*datatype_size)/fh->etype_size; + incr = (count*datatype_size)/adio_fh->etype_size; /* Use a message as a 'token' to order the operations */ source = myrank - 1; dest = myrank + 1; if (source < 0) source = MPI_PROC_NULL; if (dest >= nprocs) dest = MPI_PROC_NULL; - MPI_Recv(NULL, 0, MPI_BYTE, source, 0, fh->comm, MPI_STATUS_IGNORE); + MPI_Recv(NULL, 0, MPI_BYTE, source, 0, adio_fh->comm, MPI_STATUS_IGNORE); - ADIO_Get_shared_fp(fh, incr, &shared_fp, &error_code); + ADIO_Get_shared_fp(adio_fh, incr, &shared_fp, &error_code); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) { - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ - MPI_Send(NULL, 0, MPI_BYTE, dest, 0, fh->comm); + MPI_Send(NULL, 0, MPI_BYTE, dest, 0, adio_fh->comm); - ADIO_ReadStridedColl(fh, buf, count, datatype, ADIO_EXPLICIT_OFFSET, + ADIO_ReadStridedColl(adio_fh, buf, count, datatype, ADIO_EXPLICIT_OFFSET, shared_fp, status, &error_code); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); /* --END ERROR HANDLING-- */ fn_exit: diff --git a/ompi/mca/io/romio/romio/mpi-io/read_ordb.c b/ompi/mca/io/romio/romio/mpi-io/read_ordb.c index 2686ca3727..324fa7f7de 100644 --- a/ompi/mca/io/romio/romio/mpi-io/read_ordb.c +++ b/ompi/mca/io/romio/romio/mpi-io/read_ordb.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -36,76 +36,96 @@ Output Parameters: .N fortran @*/ -int MPI_File_read_ordered_begin(MPI_File mpi_fh, void *buf, int count, +int MPI_File_read_ordered_begin(MPI_File fh, void *buf, int count, MPI_Datatype datatype) { int error_code, datatype_size, nprocs, myrank, incr; int source, dest; ADIO_Offset shared_fp; - ADIO_File fh; + ADIO_File adio_fh; static char myname[] = "MPI_FILE_READ_ORDERED_BEGIN"; + void *xbuf=NULL, *e32_buf=NULL; MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); - MPIO_CHECK_COUNT(fh, count, myname, error_code); - MPIO_CHECK_DATATYPE(fh, datatype, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); + MPIO_CHECK_COUNT(adio_fh, count, myname, error_code); + MPIO_CHECK_DATATYPE(adio_fh, datatype, myname, error_code); - if (fh->split_coll_count) + if (adio_fh->split_coll_count) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_IO, "**iosplitcoll", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ - fh->split_coll_count = 1; + adio_fh->split_coll_count = 1; MPI_Type_size(datatype, &datatype_size); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_INTEGRAL_ETYPE(fh, count, datatype_size, myname, error_code); - MPIO_CHECK_FS_SUPPORTS_SHARED(fh, myname, error_code); - MPIO_CHECK_COUNT_SIZE(fh, count, datatype_size, myname, error_code); + MPIO_CHECK_INTEGRAL_ETYPE(adio_fh, count, datatype_size, myname, error_code); + MPIO_CHECK_FS_SUPPORTS_SHARED(adio_fh, myname, error_code); + MPIO_CHECK_COUNT_SIZE(adio_fh, count, datatype_size, myname, error_code); /* --END ERROR HANDLING-- */ - ADIOI_TEST_DEFERRED(fh, myname, &error_code); + ADIOI_TEST_DEFERRED(adio_fh, myname, &error_code); - MPI_Comm_size(fh->comm, &nprocs); - MPI_Comm_rank(fh->comm, &myrank); + MPI_Comm_size(adio_fh->comm, &nprocs); + MPI_Comm_rank(adio_fh->comm, &myrank); - incr = (count*datatype_size)/fh->etype_size; + incr = (count*datatype_size)/adio_fh->etype_size; /* Use a message as a 'token' to order the operations */ source = myrank - 1; dest = myrank + 1; if (source < 0) source = MPI_PROC_NULL; if (dest >= nprocs) dest = MPI_PROC_NULL; - MPI_Recv(NULL, 0, MPI_BYTE, source, 0, fh->comm, MPI_STATUS_IGNORE); + MPI_Recv(NULL, 0, MPI_BYTE, source, 0, adio_fh->comm, MPI_STATUS_IGNORE); - ADIO_Get_shared_fp(fh, incr, &shared_fp, &error_code); + ADIO_Get_shared_fp(adio_fh, incr, &shared_fp, &error_code); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) { - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ - MPI_Send(NULL, 0, MPI_BYTE, dest, 0, fh->comm); + MPI_Send(NULL, 0, MPI_BYTE, dest, 0, adio_fh->comm); - ADIO_ReadStridedColl(fh, buf, count, datatype, ADIO_EXPLICIT_OFFSET, - shared_fp, &fh->split_status, &error_code); + xbuf = buf; + if (adio_fh->is_external32) + { + MPI_Aint e32_size = 0; + error_code = MPIU_datatype_full_size(datatype, &e32_size); + if (error_code != MPI_SUCCESS) + goto fn_exit; + + e32_buf = ADIOI_Malloc(e32_size*count); + xbuf = e32_buf; + } + + + ADIO_ReadStridedColl(adio_fh, xbuf, count, datatype, ADIO_EXPLICIT_OFFSET, + shared_fp, &adio_fh->split_status, &error_code); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); /* --END ERROR HANDLING-- */ + if (e32_buf != NULL) { + error_code = MPIU_read_external32_conversion_fn(xbuf, datatype, + count, e32_buf); + ADIOI_Free(e32_buf); + } + fn_exit: MPIU_THREAD_CS_EXIT(ALLFUNC,); diff --git a/ompi/mca/io/romio/romio/mpi-io/read_orde.c b/ompi/mca/io/romio/romio/mpi-io/read_orde.c index d07a2ddf43..4d2db5296d 100644 --- a/ompi/mca/io/romio/romio/mpi-io/read_orde.c +++ b/ompi/mca/io/romio/romio/mpi-io/read_orde.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -35,36 +35,36 @@ Output Parameters: .N fortran @*/ -int MPI_File_read_ordered_end(MPI_File mpi_fh, void *buf, MPI_Status *status) +int MPI_File_read_ordered_end(MPI_File fh, void *buf, MPI_Status *status) { int error_code=MPI_SUCCESS; - ADIO_File fh; + ADIO_File adio_fh; static char myname[] = "MPI_FILE_READ_ORDERED_END"; MPIU_UNREFERENCED_ARG(buf); MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); - if (!(fh->split_coll_count)) + if (!(adio_fh->split_coll_count)) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_IO, "**iosplitcollnone", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ #ifdef HAVE_STATUS_SET_BYTES if (status != MPI_STATUS_IGNORE) - *status = fh->split_status; + *status = adio_fh->split_status; #endif - fh->split_coll_count = 0; + adio_fh->split_coll_count = 0; fn_exit: MPIU_THREAD_CS_EXIT(ALLFUNC,); diff --git a/ompi/mca/io/romio/romio/mpi-io/read_sh.c b/ompi/mca/io/romio/romio/mpi-io/read_sh.c index f1459767f3..15368384ed 100644 --- a/ompi/mca/io/romio/romio/mpi-io/read_sh.c +++ b/ompi/mca/io/romio/romio/mpi-io/read_sh.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -39,29 +39,30 @@ Output Parameters: .N fortran @*/ -int MPI_File_read_shared(MPI_File mpi_fh, void *buf, int count, +int MPI_File_read_shared(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPI_Status *status) { int error_code, bufsize, buftype_is_contig, filetype_is_contig; static char myname[] = "MPI_FILE_READ_SHARED"; int datatype_size, incr; ADIO_Offset off, shared_fp; - ADIO_File fh; + ADIO_File adio_fh; + void *xbuf=NULL, *e32_buf=NULL; MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); - MPIO_CHECK_COUNT(fh, count, myname, error_code); - MPIO_CHECK_DATATYPE(fh, datatype, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); + MPIO_CHECK_COUNT(adio_fh, count, myname, error_code); + MPIO_CHECK_DATATYPE(adio_fh, datatype, myname, error_code); /* --END ERROR HANDLING-- */ MPI_Type_size(datatype, &datatype_size); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_COUNT_SIZE(fh, count, datatype_size, myname, error_code); + MPIO_CHECK_COUNT_SIZE(adio_fh, count, datatype_size, myname, error_code); /* --END ERROR HANDLING-- */ if (count*datatype_size == 0) @@ -74,59 +75,76 @@ int MPI_File_read_shared(MPI_File mpi_fh, void *buf, int count, } /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_INTEGRAL_ETYPE(fh, count, datatype_size, myname, error_code); - MPIO_CHECK_READABLE(fh, myname, error_code); - MPIO_CHECK_FS_SUPPORTS_SHARED(fh, myname, error_code); + MPIO_CHECK_INTEGRAL_ETYPE(adio_fh, count, datatype_size, myname, error_code); + MPIO_CHECK_READABLE(adio_fh, myname, error_code); + MPIO_CHECK_FS_SUPPORTS_SHARED(adio_fh, myname, error_code); /* --END ERROR HANDLING-- */ ADIOI_Datatype_iscontig(datatype, &buftype_is_contig); - ADIOI_Datatype_iscontig(fh->filetype, &filetype_is_contig); + ADIOI_Datatype_iscontig(adio_fh->filetype, &filetype_is_contig); - ADIOI_TEST_DEFERRED(fh, myname, &error_code); + ADIOI_TEST_DEFERRED(adio_fh, myname, &error_code); - incr = (count*datatype_size)/fh->etype_size; + incr = (count*datatype_size)/adio_fh->etype_size; - ADIO_Get_shared_fp(fh, incr, &shared_fp, &error_code); + ADIO_Get_shared_fp(adio_fh, incr, &shared_fp, &error_code); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) { - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ + xbuf = buf; + if (adio_fh->is_external32) + { + MPI_Aint e32_size = 0; + error_code = MPIU_datatype_full_size(datatype, &e32_size); + if (error_code != MPI_SUCCESS) + goto fn_exit; + + e32_buf = ADIOI_Malloc(e32_size*count); + xbuf = e32_buf; + } + /* contiguous or strided? */ if (buftype_is_contig && filetype_is_contig) { /* convert count and shared_fp to bytes */ bufsize = datatype_size * count; - off = fh->disp + fh->etype_size * shared_fp; + off = adio_fh->disp + adio_fh->etype_size * shared_fp; /* if atomic mode requested, lock (exclusive) the region, because there could be a concurrent noncontiguous request. On NFS, locking is done in the ADIO_ReadContig.*/ - if ((fh->atomicity) && (fh->file_system != ADIO_NFS)) - ADIOI_WRITE_LOCK(fh, off, SEEK_SET, bufsize); + if ((adio_fh->atomicity) && (adio_fh->file_system != ADIO_NFS)) + ADIOI_WRITE_LOCK(adio_fh, off, SEEK_SET, bufsize); - ADIO_ReadContig(fh, buf, count, datatype, ADIO_EXPLICIT_OFFSET, + ADIO_ReadContig(adio_fh, xbuf, count, datatype, ADIO_EXPLICIT_OFFSET, off, status, &error_code); - if ((fh->atomicity) && (fh->file_system != ADIO_NFS)) - ADIOI_UNLOCK(fh, off, SEEK_SET, bufsize); + if ((adio_fh->atomicity) && (adio_fh->file_system != ADIO_NFS)) + ADIOI_UNLOCK(adio_fh, off, SEEK_SET, bufsize); } else { - ADIO_ReadStrided(fh, buf, count, datatype, ADIO_EXPLICIT_OFFSET, + ADIO_ReadStrided(adio_fh, xbuf, count, datatype, ADIO_EXPLICIT_OFFSET, shared_fp, status, &error_code); /* For strided and atomic mode, locking is done in ADIO_ReadStrided */ } /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); /* --END ERROR HANDLING-- */ + if (e32_buf != NULL) { + error_code = MPIU_read_external32_conversion_fn(xbuf, datatype, + count, e32_buf); + ADIOI_Free(e32_buf); + } fn_exit: MPIU_THREAD_CS_EXIT(ALLFUNC,); diff --git a/ompi/mca/io/romio/romio/mpi-io/register_datarep.c b/ompi/mca/io/romio/romio/mpi-io/register_datarep.c index c528abfc72..c4f6a469d0 100644 --- a/ompi/mca/io/romio/romio/mpi-io/register_datarep.c +++ b/ompi/mca/io/romio/romio/mpi-io/register_datarep.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. @@ -27,13 +27,13 @@ MPI_Register_datarep - Register functions for user-defined data representations - Input Parameters: -+ name - data representation name (string) -. read_conv_fn - function invoked to convert from file representation to +Input Parameters: ++ datarep - data representation name (string) +. read_conversion_fn - function invoked to convert from file representation to native representation (function) -. write_conv_fn - function invoked to convert from native representation to +. write_conversion_fn - function invoked to convert from native representation to file representation (function) -. extent_fn - function invoked to get the exted of a datatype as represented +. dtype_file_extent_fn - function invoked to get the exted of a datatype as represented in the file (function) - extra_state - pointer to extra state that is passed to each of the three functions @@ -48,14 +48,14 @@ .N fortran @*/ -int MPI_Register_datarep(char *name, - MPI_Datarep_conversion_function *read_conv_fn, - MPI_Datarep_conversion_function *write_conv_fn, - MPI_Datarep_extent_function *extent_fn, - void *state) +int MPI_Register_datarep(const char *datarep, + MPI_Datarep_conversion_function *read_conversion_fn, + MPI_Datarep_conversion_function *write_conversion_fn, + MPI_Datarep_extent_function *dtype_file_extent_fn, + void *extra_state) { int error_code; - ADIOI_Datarep *datarep; + ADIOI_Datarep *adio_datarep; static char myname[] = "MPI_REGISTER_DATAREP"; MPIU_THREAD_CS_ENTER(ALLFUNC,); @@ -63,9 +63,9 @@ int MPI_Register_datarep(char *name, /* --BEGIN ERROR HANDLING-- */ /* check datarep name (use strlen instead of strnlen because strnlen is not portable) */ - if (name == NULL || - strlen(name) < 1 || - strlen(name) > MPI_MAX_DATAREP_STRING) + if (datarep == NULL || + strlen(datarep) < 1 || + strlen(datarep) > MPI_MAX_DATAREP_STRING) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, @@ -82,22 +82,22 @@ int MPI_Register_datarep(char *name, /* --BEGIN ERROR HANDLING-- */ /* check datarep isn't already registered */ - for (datarep = ADIOI_Datarep_head; datarep; datarep = datarep->next) { - if (!strncmp(name, datarep->name, MPI_MAX_DATAREP_STRING)) { + for (adio_datarep = ADIOI_Datarep_head; adio_datarep; adio_datarep = adio_datarep->next) { + if (!strncmp(datarep, adio_datarep->name, MPI_MAX_DATAREP_STRING)) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_DUP_DATAREP, "**datarepused", "**datarepused %s", - name); + datarep); error_code = MPIO_Err_return_file(MPI_FILE_NULL, error_code); goto fn_exit; } } /* check extent function pointer */ - if (extent_fn == NULL) + if (dtype_file_extent_fn == NULL) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, @@ -109,22 +109,15 @@ int MPI_Register_datarep(char *name, } /* --END ERROR HANDLING-- */ - datarep = ADIOI_Malloc(sizeof(ADIOI_Datarep)); -/* need to ifdef MPICH2 because if it is MPICH2 in memory tracing mode, it will complain - about the use of strdup instead of MPIU_Strdup. (mpiimpl.h is being included in mpioimpl.h - ifdef MPICH2 */ -#ifdef MPICH2 - datarep->name = MPIU_Strdup(name); -#else - datarep->name = ADIOI_Strdup(name); -#endif - datarep->state = state; - datarep->read_conv_fn = read_conv_fn; - datarep->write_conv_fn = write_conv_fn; - datarep->extent_fn = extent_fn; - datarep->next = ADIOI_Datarep_head; + adio_datarep = ADIOI_Malloc(sizeof(ADIOI_Datarep)); + adio_datarep->name = ADIOI_Strdup(datarep); + adio_datarep->state = extra_state; + adio_datarep->read_conv_fn = read_conversion_fn; + adio_datarep->write_conv_fn = write_conversion_fn; + adio_datarep->extent_fn = dtype_file_extent_fn; + adio_datarep->next = ADIOI_Datarep_head; - ADIOI_Datarep_head = datarep; + ADIOI_Datarep_head = adio_datarep; error_code = MPI_SUCCESS; diff --git a/ompi/mca/io/romio/romio/mpi-io/seek.c b/ompi/mca/io/romio/romio/mpi-io/seek.c index e038d4fa7d..a67c119d28 100644 --- a/ompi/mca/io/romio/romio/mpi-io/seek.c +++ b/ompi/mca/io/romio/romio/mpi-io/seek.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -34,26 +34,26 @@ Input Parameters: .N fortran @*/ -int MPI_File_seek(MPI_File mpi_fh, MPI_Offset offset, int whence) +int MPI_File_seek(MPI_File fh, MPI_Offset offset, int whence) { int error_code; - ADIO_File fh; + ADIO_File adio_fh; static char myname[] = "MPI_FILE_SEEK"; MPI_Offset curr_offset, eof_offset; #ifdef MPI_hpux int fl_xmpi; - HPMP_IO_START(fl_xmpi, BLKMPIFILESEEK, TRDTBLOCK, fh, MPI_DATATYPE_NULL, -1); + HPMP_IO_START(fl_xmpi, BLKMPIFILESEEK, TRDTBLOCK, adio_fh, MPI_DATATYPE_NULL, -1); #endif /* MPI_hpux */ MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); - MPIO_CHECK_NOT_SEQUENTIAL_MODE(fh, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); + MPIO_CHECK_NOT_SEQUENTIAL_MODE(adio_fh, myname, error_code); /* --END ERROR HANDLING-- */ switch(whence) { @@ -64,14 +64,14 @@ int MPI_File_seek(MPI_File mpi_fh, MPI_Offset offset, int whence) MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**iobadoffset", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ break; case MPI_SEEK_CUR: /* find offset corr. to current location of file pointer */ - ADIOI_Get_position(fh, &curr_offset); + ADIOI_Get_position(adio_fh, &curr_offset); offset += curr_offset; /* --BEGIN ERROR HANDLING-- */ @@ -80,7 +80,7 @@ int MPI_File_seek(MPI_File mpi_fh, MPI_Offset offset, int whence) MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**ionegoffset", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ @@ -89,10 +89,10 @@ int MPI_File_seek(MPI_File mpi_fh, MPI_Offset offset, int whence) case MPI_SEEK_END: /* we can in many cases do seeks w/o a file actually opened, but not in * the MPI_SEEK_END case */ - ADIOI_TEST_DEFERRED(fh, "MPI_File_seek", &error_code); + ADIOI_TEST_DEFERRED(adio_fh, "MPI_File_seek", &error_code); /* find offset corr. to end of file */ - ADIOI_Get_eof_offset(fh, &eof_offset); + ADIOI_Get_eof_offset(adio_fh, &eof_offset); offset += eof_offset; /* --BEGIN ERROR HANDLING-- */ @@ -101,7 +101,7 @@ int MPI_File_seek(MPI_File mpi_fh, MPI_Offset offset, int whence) MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**ionegoffset", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ @@ -112,21 +112,21 @@ int MPI_File_seek(MPI_File mpi_fh, MPI_Offset offset, int whence) error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**iobadwhence", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; /* --END ERROR HANDLING-- */ } - ADIO_SeekIndividual(fh, offset, ADIO_SEEK_SET, &error_code); + ADIO_SeekIndividual(adio_fh, offset, ADIO_SEEK_SET, &error_code); /* TODO: what do we do with this error? */ /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); /* --END ERROR HANDLING-- */ #ifdef MPI_hpux - HPMP_IO_END(fl_xmpi, fh, MPI_DATATYPE_NULL, -1); + HPMP_IO_END(fl_xmpi, adio_fh, MPI_DATATYPE_NULL, -1); #endif /* MPI_hpux */ error_code = MPI_SUCCESS; diff --git a/ompi/mca/io/romio/romio/mpi-io/seek_sh.c b/ompi/mca/io/romio/romio/mpi-io/seek_sh.c index feb11ae756..d104be5ac5 100644 --- a/ompi/mca/io/romio/romio/mpi-io/seek_sh.c +++ b/ompi/mca/io/romio/romio/mpi-io/seek_sh.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. @@ -32,52 +32,52 @@ Input Parameters: .N fortran @*/ -int MPI_File_seek_shared(MPI_File mpi_fh, MPI_Offset offset, int whence) +int MPI_File_seek_shared(MPI_File fh, MPI_Offset offset, int whence) { int error_code=MPI_SUCCESS, tmp_whence, myrank; static char myname[] = "MPI_FILE_SEEK_SHARED"; MPI_Offset curr_offset, eof_offset, tmp_offset; - ADIO_File fh; + ADIO_File adio_fh; MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); - MPIO_CHECK_NOT_SEQUENTIAL_MODE(fh, myname, error_code); - MPIO_CHECK_FS_SUPPORTS_SHARED(fh, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); + MPIO_CHECK_NOT_SEQUENTIAL_MODE(adio_fh, myname, error_code); + MPIO_CHECK_FS_SUPPORTS_SHARED(adio_fh, myname, error_code); /* --END ERROR HANDLING-- */ tmp_offset = offset; - MPI_Bcast(&tmp_offset, 1, ADIO_OFFSET, 0, fh->comm); + MPI_Bcast(&tmp_offset, 1, ADIO_OFFSET, 0, adio_fh->comm); /* --BEGIN ERROR HANDLING-- */ if (tmp_offset != offset) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**notsame", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ tmp_whence = whence; - MPI_Bcast(&tmp_whence, 1, MPI_INT, 0, fh->comm); + MPI_Bcast(&tmp_whence, 1, MPI_INT, 0, adio_fh->comm); /* --BEGIN ERROR HANDLING-- */ if (tmp_whence != whence) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**iobadwhence", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ - ADIOI_TEST_DEFERRED(fh, "MPI_File_seek_shared", &error_code); + ADIOI_TEST_DEFERRED(adio_fh, "MPI_File_seek_shared", &error_code); - MPI_Comm_rank(fh->comm, &myrank); + MPI_Comm_rank(adio_fh->comm, &myrank); if (!myrank) { @@ -92,14 +92,14 @@ int MPI_File_seek_shared(MPI_File mpi_fh, MPI_Offset offset, int whence) myname, __LINE__, MPI_ERR_ARG, "**iobadoffset", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ break; case MPI_SEEK_CUR: /* get current location of shared file pointer */ - ADIO_Get_shared_fp(fh, 0, &curr_offset, &error_code); + ADIO_Get_shared_fp(adio_fh, 0, &curr_offset, &error_code); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) { @@ -108,7 +108,7 @@ int MPI_File_seek_shared(MPI_File mpi_fh, MPI_Offset offset, int whence) myname, __LINE__, MPI_ERR_INTERN, "**iosharedfailed", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ @@ -121,14 +121,14 @@ int MPI_File_seek_shared(MPI_File mpi_fh, MPI_Offset offset, int whence) myname, __LINE__, MPI_ERR_ARG, "**ionegoffset", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ break; case MPI_SEEK_END: /* find offset corr. to end of file */ - ADIOI_Get_eof_offset(fh, &eof_offset); + ADIOI_Get_eof_offset(adio_fh, &eof_offset); offset += eof_offset; /* --BEGIN ERROR HANDLING-- */ if (offset < 0) @@ -138,7 +138,7 @@ int MPI_File_seek_shared(MPI_File mpi_fh, MPI_Offset offset, int whence) myname, __LINE__, MPI_ERR_ARG, "**ionegoffset", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ @@ -149,12 +149,12 @@ int MPI_File_seek_shared(MPI_File mpi_fh, MPI_Offset offset, int whence) MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**iobadwhence", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; /* --END ERROR HANDLING-- */ } - ADIO_Set_shared_fp(fh, offset, &error_code); + ADIO_Set_shared_fp(adio_fh, offset, &error_code); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) { @@ -163,7 +163,7 @@ int MPI_File_seek_shared(MPI_File mpi_fh, MPI_Offset offset, int whence) myname, __LINE__, MPI_ERR_INTERN, "**iosharedfailed", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ @@ -171,7 +171,7 @@ int MPI_File_seek_shared(MPI_File mpi_fh, MPI_Offset offset, int whence) } /* FIXME: explain why the barrier is necessary */ - MPI_Barrier(fh->comm); + MPI_Barrier(adio_fh->comm); error_code = MPI_SUCCESS; diff --git a/ompi/mca/io/romio/romio/mpi-io/set_atom.c b/ompi/mca/io/romio/romio/mpi-io/set_atom.c index 4a1c4655f6..55be27fa05 100644 --- a/ompi/mca/io/romio/romio/mpi-io/set_atom.c +++ b/ompi/mca/io/romio/romio/mpi-io/set_atom.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -32,40 +32,40 @@ Input Parameters: .N fortran @*/ -int MPI_File_set_atomicity(MPI_File mpi_fh, int flag) +int MPI_File_set_atomicity(MPI_File fh, int flag) { int error_code, tmp_flag; static char myname[] = "MPI_FILE_SET_ATOMICITY"; ADIO_Fcntl_t *fcntl_struct; - ADIO_File fh; + ADIO_File adio_fh; MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); /* --END ERROR HANDLING-- */ - ADIOI_TEST_DEFERRED(fh, myname, &error_code); + ADIOI_TEST_DEFERRED(adio_fh, myname, &error_code); if (flag) flag = 1; /* take care of non-one values! */ /* check if flag is the same on all processes */ tmp_flag = flag; - MPI_Bcast(&tmp_flag, 1, MPI_INT, 0, fh->comm); + MPI_Bcast(&tmp_flag, 1, MPI_INT, 0, adio_fh->comm); /* --BEGIN ERROR HANDLING-- */ if (tmp_flag != flag) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**notsame", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ - if (fh->atomicity == flag){ + if (adio_fh->atomicity == flag){ error_code = MPI_SUCCESS; goto fn_exit; } @@ -73,12 +73,12 @@ int MPI_File_set_atomicity(MPI_File mpi_fh, int flag) fcntl_struct = (ADIO_Fcntl_t *) ADIOI_Malloc(sizeof(ADIO_Fcntl_t)); fcntl_struct->atomicity = flag; - ADIO_Fcntl(fh, ADIO_FCNTL_SET_ATOMICITY, fcntl_struct, &error_code); + ADIO_Fcntl(adio_fh, ADIO_FCNTL_SET_ATOMICITY, fcntl_struct, &error_code); /* TODO: what do we do with this error code? */ /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); /* --END ERROR HANDLING-- */ ADIOI_Free(fcntl_struct); diff --git a/ompi/mca/io/romio/romio/mpi-io/set_errh.c b/ompi/mca/io/romio/romio/mpi-io/set_errh.c index 991d3e40e6..3e2d87951e 100644 --- a/ompi/mca/io/romio/romio/mpi-io/set_errh.c +++ b/ompi/mca/io/romio/romio/mpi-io/set_errh.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. diff --git a/ompi/mca/io/romio/romio/mpi-io/set_info.c b/ompi/mca/io/romio/romio/mpi-io/set_info.c index e99fdc8fe7..9fe8ab61cb 100644 --- a/ompi/mca/io/romio/romio/mpi-io/set_info.c +++ b/ompi/mca/io/romio/romio/mpi-io/set_info.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -32,31 +32,33 @@ Input Parameters: .N fortran @*/ -int MPI_File_set_info(MPI_File mpi_fh, MPI_Info info) +int MPI_File_set_info(MPI_File fh, MPI_Info info) { int error_code; static char myname[] = "MPI_FILE_SET_INFO"; - ADIO_File fh; + ADIO_File adio_fh; MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); + MPIO_CHECK_INFO(info, error_code); /* --END ERROR HANDLING-- */ /* set new info */ - ADIO_SetInfo(fh, info, &error_code); - /* TODO: what to do with error code? */ - - /* --BEGIN ERROR HANDLING-- */ - if (error_code != MPI_SUCCESS) - error_code = MPIO_Err_return_file(fh, error_code); - /* --END ERROR HANDLING-- */ + ADIO_SetInfo(adio_fh, info, &error_code); fn_exit: + /* --BEGIN ERROR HANDLING-- */ + if (error_code != MPI_SUCCESS) + error_code = MPIO_Err_return_file(adio_fh, error_code); + /* --END ERROR HANDLING-- */ + MPIU_THREAD_CS_EXIT(ALLFUNC,); return error_code; +fn_fail: + goto fn_exit; } diff --git a/ompi/mca/io/romio/romio/mpi-io/set_size.c b/ompi/mca/io/romio/romio/mpi-io/set_size.c index 8823b12079..c15b71b1fc 100644 --- a/ompi/mca/io/romio/romio/mpi-io/set_size.c +++ b/ompi/mca/io/romio/romio/mpi-io/set_size.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -32,62 +32,64 @@ Input Parameters: .N fortran @*/ -int MPI_File_set_size(MPI_File mpi_fh, MPI_Offset size) +int MPI_File_set_size(MPI_File fh, MPI_Offset size) { int error_code; - ADIO_File fh; + ADIO_File adio_fh; static char myname[] = "MPI_FILE_SET_SIZE"; - MPI_Offset tmp_sz; + MPI_Offset tmp_sz, max_sz, min_sz; #ifdef MPI_hpux int fl_xmpi; - HPMP_IO_START(fl_xmpi, BLKMPIFILESETSIZE, TRDTBLOCK, fh, + HPMP_IO_START(fl_xmpi, BLKMPIFILESETSIZE, TRDTBLOCK, adio_fh, MPI_DATATYPE_NULL, -1); #endif /* MPI_hpux */ MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); - MPIO_CHECK_NOT_SEQUENTIAL_MODE(fh, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); + MPIO_CHECK_NOT_SEQUENTIAL_MODE(adio_fh, myname, error_code); if (size < 0) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**iobadsize", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } + MPIO_CHECK_WRITABLE(fh, myname, error_code); /* --END ERROR HANDLING-- */ tmp_sz = size; - MPI_Bcast(&tmp_sz, 1, ADIO_OFFSET, 0, fh->comm); + MPI_Allreduce(&tmp_sz, &max_sz, 1, ADIO_OFFSET, MPI_MAX, adio_fh->comm); + MPI_Allreduce(&tmp_sz, &min_sz, 1, ADIO_OFFSET, MPI_MIN, adio_fh->comm); /* --BEGIN ERROR HANDLING-- */ - if (tmp_sz != size) { + if (max_sz != min_sz) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**notsame", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ - ADIOI_TEST_DEFERRED(fh, "MPI_File_set_size", &error_code); + ADIOI_TEST_DEFERRED(adio_fh, "MPI_File_set_size", &error_code); - ADIO_Resize(fh, size, &error_code); + ADIO_Resize(adio_fh, size, &error_code); /* TODO: what to do with error code? */ /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); /* --END ERROR HANDLING-- */ #ifdef MPI_hpux - HPMP_IO_END(fl_xmpi, fh, MPI_DATATYPE_NULL, -1); + HPMP_IO_END(fl_xmpi, adio_fh, MPI_DATATYPE_NULL, -1); #endif /* MPI_hpux */ fn_exit: diff --git a/ompi/mca/io/romio/romio/mpi-io/set_view.c b/ompi/mca/io/romio/romio/mpi-io/set_view.c index ea0cbf112f..92f916f484 100644 --- a/ompi/mca/io/romio/romio/mpi-io/set_view.c +++ b/ompi/mca/io/romio/romio/mpi-io/set_view.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -36,27 +36,27 @@ Input Parameters: .N fortran @*/ -int MPI_File_set_view(MPI_File mpi_fh, MPI_Offset disp, MPI_Datatype etype, - MPI_Datatype filetype, char *datarep, MPI_Info info) +int MPI_File_set_view(MPI_File fh, MPI_Offset disp, MPI_Datatype etype, + MPI_Datatype filetype, const char *datarep, MPI_Info info) { int filetype_size, etype_size, error_code; static char myname[] = "MPI_FILE_SET_VIEW"; ADIO_Offset shared_fp, byte_off; - ADIO_File fh; + ADIO_File adio_fh; MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); if ((disp < 0) && (disp != MPI_DISPLACEMENT_CURRENT)) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**iobaddisp", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } @@ -65,87 +65,105 @@ int MPI_File_set_view(MPI_File mpi_fh, MPI_Offset disp, MPI_Datatype etype, error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**ioetype", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } + MPIO_DATATYPE_ISCOMMITTED(etype, error_code); + if (error_code != MPI_SUCCESS) { + error_code = MPIO_Err_return_file(adio_fh, error_code); + goto fn_exit; + } if (filetype == MPI_DATATYPE_NULL) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**iofiletype", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } + MPIO_DATATYPE_ISCOMMITTED(filetype, error_code); + if (error_code != MPI_SUCCESS) { + error_code = MPIO_Err_return_file(adio_fh, error_code); + goto fn_exit; + } - if ((fh->access_mode & MPI_MODE_SEQUENTIAL) && + if ((adio_fh->access_mode & MPI_MODE_SEQUENTIAL) && (disp != MPI_DISPLACEMENT_CURRENT)) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**iodispifseq", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } if ((disp == MPI_DISPLACEMENT_CURRENT) && - !(fh->access_mode & MPI_MODE_SEQUENTIAL)) + !(adio_fh->access_mode & MPI_MODE_SEQUENTIAL)) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**iodispifseq", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } + if(info != MPI_INFO_NULL){ + MPIO_CHECK_INFO(info, error_code); + } /* --END ERROR HANDLING-- */ MPI_Type_size(filetype, &filetype_size); MPI_Type_size(etype, &etype_size); /* --BEGIN ERROR HANDLING-- */ - if (filetype_size % etype_size != 0) + if (etype_size != 0 && filetype_size % etype_size != 0) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**iofiletype", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } - if (strcmp(datarep, "native") && strcmp(datarep, "NATIVE")) + if (strcmp(datarep, "native") && + strcmp(datarep, "NATIVE") && + strcmp(datarep, "external32") && + strcmp(datarep, "EXTERNAL32") && + strcmp(datarep, "internal") && + strcmp(datarep, "INTERNAL")) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_UNSUPPORTED_DATAREP, "**unsupporteddatarep",0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ if (disp == MPI_DISPLACEMENT_CURRENT) { - MPI_Barrier(fh->comm); - ADIO_Get_shared_fp(fh, 0, &shared_fp, &error_code); + MPI_Barrier(adio_fh->comm); + ADIO_Get_shared_fp(adio_fh, 0, &shared_fp, &error_code); /* TODO: check error code */ - MPI_Barrier(fh->comm); - ADIOI_Get_byte_offset(fh, shared_fp, &byte_off); + MPI_Barrier(adio_fh->comm); + ADIOI_Get_byte_offset(adio_fh, shared_fp, &byte_off); /* TODO: check error code */ disp = byte_off; } - ADIO_Set_view(fh, disp, etype, filetype, info, &error_code); + ADIO_Set_view(adio_fh, disp, etype, filetype, info, &error_code); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) { - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ /* reset shared file pointer to zero */ - if (ADIO_Feature(fh, ADIO_SHARED_FP) && - (fh->shared_fp_fd != ADIO_FILE_NULL)) + if (ADIO_Feature(adio_fh, ADIO_SHARED_FP) && + (adio_fh->shared_fp_fd != ADIO_FILE_NULL)) { /* only one process needs to set it to zero, but I don't want to create the shared-file-pointer file if shared file pointers have @@ -156,20 +174,29 @@ int MPI_File_set_view(MPI_File mpi_fh, MPI_Offset disp, MPI_Datatype etype, relative to the current view, whereas indiv. file pointer is stored in bytes. */ - ADIO_Set_shared_fp(fh, 0, &error_code); + ADIO_Set_shared_fp(adio_fh, 0, &error_code); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); /* --END ERROR HANDLING-- */ } - if (ADIO_Feature(fh, ADIO_SHARED_FP)) + if (ADIO_Feature(adio_fh, ADIO_SHARED_FP)) { - MPI_Barrier(fh->comm); /* for above to work correctly */ + MPI_Barrier(adio_fh->comm); /* for above to work correctly */ } + if (strcmp(datarep, "external32") && strcmp(datarep, "EXTERNAL32")) + adio_fh->is_external32 = 0; + else + adio_fh->is_external32 = 1; fn_exit: MPIU_THREAD_CS_EXIT(ALLFUNC,); return error_code; +fn_fail: + /* --BEGIN ERROR HANDLING-- */ + error_code = MPIO_Err_return_file(fh, error_code); + goto fn_exit; + /* --END ERROR HANDLING-- */ } diff --git a/ompi/mca/io/romio/romio/mpi-io/wr_atallb.c b/ompi/mca/io/romio/romio/mpi-io/wr_atallb.c index 2b3c226f7b..07fe9891f8 100644 --- a/ompi/mca/io/romio/romio/mpi-io/wr_atallb.c +++ b/ompi/mca/io/romio/romio/mpi-io/wr_atallb.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -25,7 +25,7 @@ /*@ MPI_File_write_at_all_begin - Begin a split collective write using - explict offset + explicit offset Input Parameters: . fh - file handle (handle) @@ -36,13 +36,13 @@ Input Parameters: .N fortran @*/ -int MPI_File_write_at_all_begin(MPI_File mpi_fh, MPI_Offset offset, void *buf, +int MPI_File_write_at_all_begin(MPI_File fh, MPI_Offset offset, const void *buf, int count, MPI_Datatype datatype) { int error_code; static char myname[] = "MPI_FILE_WRITE_AT_ALL_BEGIN"; - error_code = MPIOI_File_write_all_begin(mpi_fh, offset, + error_code = MPIOI_File_write_all_begin(fh, offset, ADIO_EXPLICIT_OFFSET, buf, count, datatype, myname); diff --git a/ompi/mca/io/romio/romio/mpi-io/wr_atalle.c b/ompi/mca/io/romio/romio/mpi-io/wr_atalle.c index c19eb9cac8..dc41651280 100644 --- a/ompi/mca/io/romio/romio/mpi-io/wr_atalle.c +++ b/ompi/mca/io/romio/romio/mpi-io/wr_atalle.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -24,7 +24,7 @@ #endif /*@ - MPI_File_write_at_all_end - Complete a split collective write using explict offset + MPI_File_write_at_all_end - Complete a split collective write using explicit offset Input Parameters: . fh - file handle (handle) @@ -35,12 +35,12 @@ Output Parameters: .N fortran @*/ -int MPI_File_write_at_all_end(MPI_File mpi_fh, void *buf, MPI_Status *status) +int MPI_File_write_at_all_end(MPI_File fh, const void *buf, MPI_Status *status) { int error_code; static char myname[] = "MPI_FILE_WRITE_AT_ALL_END"; - error_code = MPIOI_File_write_all_end(mpi_fh, buf, myname, status); + error_code = MPIOI_File_write_all_end(fh, buf, myname, status); return error_code; } diff --git a/ompi/mca/io/romio/romio/mpi-io/write.c b/ompi/mca/io/romio/romio/mpi-io/write.c index dbd089ae77..aacc3a099d 100644 --- a/ompi/mca/io/romio/romio/mpi-io/write.c +++ b/ompi/mca/io/romio/romio/mpi-io/write.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. @@ -38,7 +38,7 @@ Output Parameters: .N fortran @*/ -int MPI_File_write(MPI_File mpi_fh, void *buf, int count, +int MPI_File_write(MPI_File fh, const void *buf, int count, MPI_Datatype datatype, MPI_Status *status) { int error_code; @@ -49,7 +49,7 @@ int MPI_File_write(MPI_File mpi_fh, void *buf, int count, HPMP_IO_START(fl_xmpi, BLKMPIFILEWRITE, TRDTBLOCK, fh, datatype, count); #endif /* MPI_hpux */ - error_code = MPIOI_File_write(mpi_fh, (MPI_Offset) 0, ADIO_INDIVIDUAL, buf, + error_code = MPIOI_File_write(fh, (MPI_Offset) 0, ADIO_INDIVIDUAL, buf, count, datatype, myname, status); #ifdef MPI_hpux @@ -61,10 +61,10 @@ int MPI_File_write(MPI_File mpi_fh, void *buf, int count, /* prevent multiple definitions of this routine */ #ifdef MPIO_BUILD_PROFILING -int MPIOI_File_write(MPI_File mpi_fh, +int MPIOI_File_write(MPI_File fh, MPI_Offset offset, int file_ptr_type, - void *buf, + const void *buf, int count, MPI_Datatype datatype, char *myname, @@ -73,23 +73,25 @@ int MPIOI_File_write(MPI_File mpi_fh, int error_code, bufsize, buftype_is_contig, filetype_is_contig; int datatype_size; ADIO_Offset off; - ADIO_File fh; + ADIO_File adio_fh; + void *e32buf=NULL; + const void *xbuf=NULL; MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); - MPIO_CHECK_COUNT(fh, count, myname, error_code); - MPIO_CHECK_DATATYPE(fh, datatype, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); + MPIO_CHECK_COUNT(adio_fh, count, myname, error_code); + MPIO_CHECK_DATATYPE(adio_fh, datatype, myname, error_code); if (file_ptr_type == ADIO_EXPLICIT_OFFSET && offset < 0) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**iobadoffset", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ @@ -97,7 +99,7 @@ int MPIOI_File_write(MPI_File mpi_fh, MPI_Type_size(datatype, &datatype_size); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_COUNT_SIZE(fh, count, datatype_size, myname, error_code); + MPIO_CHECK_COUNT_SIZE(adio_fh, count, datatype_size, myname, error_code); /* --END ERROR HANDLING-- */ if (count*datatype_size == 0) @@ -110,25 +112,34 @@ int MPIOI_File_write(MPI_File mpi_fh, } /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_INTEGRAL_ETYPE(fh, count, datatype_size, myname, error_code); - MPIO_CHECK_WRITABLE(fh, myname, error_code); - MPIO_CHECK_NOT_SEQUENTIAL_MODE(fh, myname, error_code); + MPIO_CHECK_INTEGRAL_ETYPE(adio_fh, count, datatype_size, myname, error_code); + MPIO_CHECK_WRITABLE(adio_fh, myname, error_code); + MPIO_CHECK_NOT_SEQUENTIAL_MODE(adio_fh, myname, error_code); /* --END ERROR HANDLING-- */ ADIOI_Datatype_iscontig(datatype, &buftype_is_contig); - ADIOI_Datatype_iscontig(fh->filetype, &filetype_is_contig); + ADIOI_Datatype_iscontig(adio_fh->filetype, &filetype_is_contig); - ADIOI_TEST_DEFERRED(fh, myname, &error_code); + ADIOI_TEST_DEFERRED(adio_fh, myname, &error_code); + + xbuf = buf; + if (adio_fh->is_external32) { + error_code = MPIU_external32_buffer_setup(buf, count, datatype, &e32buf); + if (error_code != MPI_SUCCESS) + goto fn_exit; + + xbuf = e32buf; + } if (buftype_is_contig && filetype_is_contig) { /* convert bufcount and offset to bytes */ bufsize = datatype_size * count; if (file_ptr_type == ADIO_EXPLICIT_OFFSET) { - off = fh->disp + fh->etype_size * offset; + off = adio_fh->disp + adio_fh->etype_size * offset; } else /* ADIO_INDIVIDUAL */ { - off = fh->fp_ind; + off = adio_fh->fp_ind; } /* if atomic mode requested, lock (exclusive) the region, because @@ -137,32 +148,34 @@ int MPIOI_File_write(MPI_File mpi_fh, ADIO_WriteContig. */ - if ((fh->atomicity) && ADIO_Feature(fh, ADIO_LOCKS)) + if ((adio_fh->atomicity) && ADIO_Feature(adio_fh, ADIO_LOCKS)) { - ADIOI_WRITE_LOCK(fh, off, SEEK_SET, bufsize); + ADIOI_WRITE_LOCK(adio_fh, off, SEEK_SET, bufsize); } - ADIO_WriteContig(fh, buf, count, datatype, file_ptr_type, + ADIO_WriteContig(adio_fh, xbuf, count, datatype, file_ptr_type, off, status, &error_code); - if ((fh->atomicity) && ADIO_Feature(fh, ADIO_LOCKS)) + if ((adio_fh->atomicity) && ADIO_Feature(adio_fh, ADIO_LOCKS)) { - ADIOI_UNLOCK(fh, off, SEEK_SET, bufsize); + ADIOI_UNLOCK(adio_fh, off, SEEK_SET, bufsize); } } else { /* For strided and atomic mode, locking is done in ADIO_WriteStrided */ - ADIO_WriteStrided(fh, buf, count, datatype, file_ptr_type, + ADIO_WriteStrided(adio_fh, xbuf, count, datatype, file_ptr_type, offset, status, &error_code); } + /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); /* --END ERROR HANDLING-- */ fn_exit: + if (e32buf!= NULL) ADIOI_Free(e32buf); MPIU_THREAD_CS_EXIT(ALLFUNC,); return error_code; diff --git a/ompi/mca/io/romio/romio/mpi-io/write_all.c b/ompi/mca/io/romio/romio/mpi-io/write_all.c index f5f06ca520..4b18faeebf 100644 --- a/ompi/mca/io/romio/romio/mpi-io/write_all.c +++ b/ompi/mca/io/romio/romio/mpi-io/write_all.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -39,7 +39,7 @@ Output Parameters: .N fortran @*/ -int MPI_File_write_all(MPI_File mpi_fh, void *buf, int count, +int MPI_File_write_all(MPI_File fh, const void *buf, int count, MPI_Datatype datatype, MPI_Status *status) { int error_code; @@ -50,7 +50,7 @@ int MPI_File_write_all(MPI_File mpi_fh, void *buf, int count, HPMP_IO_START(fl_xmpi, BLKMPIFILEWRITEALL, TRDTBLOCK, fh, datatype, count); #endif /* MPI_hpux */ - error_code = MPIOI_File_write_all(mpi_fh, (MPI_Offset) 0, + error_code = MPIOI_File_write_all(fh, (MPI_Offset) 0, ADIO_INDIVIDUAL, buf, count, datatype, myname, status); @@ -63,33 +63,35 @@ int MPI_File_write_all(MPI_File mpi_fh, void *buf, int count, /* prevent multiple definitions of this routine */ #ifdef MPIO_BUILD_PROFILING -int MPIOI_File_write_all(MPI_File mpi_fh, +int MPIOI_File_write_all(MPI_File fh, MPI_Offset offset, int file_ptr_type, - void *buf, + const void *buf, int count, MPI_Datatype datatype, char *myname, MPI_Status *status) { int error_code, datatype_size; - ADIO_File fh; + ADIO_File adio_fh; + void *e32buf=NULL; + const void *xbuf=NULL; MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); - MPIO_CHECK_COUNT(fh, count, myname, error_code); - MPIO_CHECK_DATATYPE(fh, datatype, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); + MPIO_CHECK_COUNT(adio_fh, count, myname, error_code); + MPIO_CHECK_DATATYPE(adio_fh, datatype, myname, error_code); if (file_ptr_type == ADIO_EXPLICIT_OFFSET && offset < 0) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**iobadoffset", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ @@ -97,21 +99,30 @@ int MPIOI_File_write_all(MPI_File mpi_fh, MPI_Type_size(datatype, &datatype_size); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_INTEGRAL_ETYPE(fh, count, datatype_size, myname, error_code); - MPIO_CHECK_WRITABLE(fh, myname, error_code); - MPIO_CHECK_NOT_SEQUENTIAL_MODE(fh, myname, error_code); - MPIO_CHECK_COUNT_SIZE(fh, count, datatype_size, myname, error_code); + MPIO_CHECK_INTEGRAL_ETYPE(adio_fh, count, datatype_size, myname, error_code); + MPIO_CHECK_WRITABLE(adio_fh, myname, error_code); + MPIO_CHECK_NOT_SEQUENTIAL_MODE(adio_fh, myname, error_code); + MPIO_CHECK_COUNT_SIZE(adio_fh, count, datatype_size, myname, error_code); /* --END ERROR HANDLING-- */ - ADIO_WriteStridedColl(fh, buf, count, datatype, file_ptr_type, + xbuf = buf; + if (adio_fh->is_external32) { + error_code = MPIU_external32_buffer_setup(buf, count, datatype, &e32buf); + if (error_code != MPI_SUCCESS) + goto fn_exit; + + xbuf = e32buf; + } + ADIO_WriteStridedColl(adio_fh, xbuf, count, datatype, file_ptr_type, offset, status, &error_code); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); /* --END ERROR HANDLING-- */ fn_exit: + if (e32buf != NULL) ADIOI_Free(e32buf); MPIU_THREAD_CS_EXIT(ALLFUNC,); return error_code; diff --git a/ompi/mca/io/romio/romio/mpi-io/write_allb.c b/ompi/mca/io/romio/romio/mpi-io/write_allb.c index ae27a6f5b9..59dd412180 100644 --- a/ompi/mca/io/romio/romio/mpi-io/write_allb.c +++ b/ompi/mca/io/romio/romio/mpi-io/write_allb.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -35,13 +35,13 @@ Input Parameters: .N fortran @*/ -int MPI_File_write_all_begin(MPI_File mpi_fh, void *buf, int count, +int MPI_File_write_all_begin(MPI_File fh, const void *buf, int count, MPI_Datatype datatype) { int error_code; static char myname[] = "MPI_FILE_WRITE_ALL_BEGIN"; - error_code = MPIOI_File_write_all_begin(mpi_fh, (MPI_Offset) 0, + error_code = MPIOI_File_write_all_begin(fh, (MPI_Offset) 0, ADIO_INDIVIDUAL, buf, count, datatype, myname); @@ -50,64 +50,77 @@ int MPI_File_write_all_begin(MPI_File mpi_fh, void *buf, int count, /* prevent multiple definitions of this routine */ #ifdef MPIO_BUILD_PROFILING -int MPIOI_File_write_all_begin(MPI_File mpi_fh, +int MPIOI_File_write_all_begin(MPI_File fh, MPI_Offset offset, int file_ptr_type, - void *buf, + const void *buf, int count, MPI_Datatype datatype, char *myname) { int error_code, datatype_size; - ADIO_File fh; + ADIO_File adio_fh; + void *e32buf=NULL; + const void *xbuf=NULL; MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); - MPIO_CHECK_COUNT(fh, count, myname, error_code); - MPIO_CHECK_DATATYPE(fh, datatype, myname, error_code); - MPIO_CHECK_NOT_SEQUENTIAL_MODE(fh, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); + MPIO_CHECK_COUNT(adio_fh, count, myname, error_code); + MPIO_CHECK_DATATYPE(adio_fh, datatype, myname, error_code); + MPIO_CHECK_NOT_SEQUENTIAL_MODE(adio_fh, myname, error_code); if (file_ptr_type == ADIO_EXPLICIT_OFFSET && offset < 0) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_ARG, "**iobadoffset", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } - if (fh->split_coll_count) + if (adio_fh->split_coll_count) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_IO, "**iosplitcoll", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ - fh->split_coll_count = 1; + adio_fh->split_coll_count = 1; MPI_Type_size(datatype, &datatype_size); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_INTEGRAL_ETYPE(fh, count, datatype_size, myname, error_code); - MPIO_CHECK_COUNT_SIZE(fh, count, datatype_size, myname, error_code); + MPIO_CHECK_INTEGRAL_ETYPE(adio_fh, count, datatype_size, myname, error_code); + MPIO_CHECK_COUNT_SIZE(adio_fh, count, datatype_size, myname, error_code); /* --END ERROR HANDLING-- */ - fh->split_datatype = datatype; - ADIO_WriteStridedColl(fh, buf, count, datatype, file_ptr_type, - offset, &fh->split_status, &error_code); + + xbuf = buf; + if (adio_fh->is_external32) { + error_code = MPIU_external32_buffer_setup(buf, count, datatype, &e32buf); + if (error_code != MPI_SUCCESS) + goto fn_exit; + + xbuf = e32buf; + } + + adio_fh->split_datatype = datatype; + ADIO_WriteStridedColl(adio_fh, xbuf, count, datatype, file_ptr_type, + offset, &adio_fh->split_status, &error_code); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); /* --END ERROR HANDLING-- */ fn_exit: + if ( e32buf != NULL) ADIOI_Free(e32buf); MPIU_THREAD_CS_EXIT(ALLFUNC,); return error_code; diff --git a/ompi/mca/io/romio/romio/mpi-io/write_alle.c b/ompi/mca/io/romio/romio/mpi-io/write_alle.c index e11f8a48ad..3e3d1a07b3 100644 --- a/ompi/mca/io/romio/romio/mpi-io/write_alle.c +++ b/ompi/mca/io/romio/romio/mpi-io/write_alle.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -35,41 +35,41 @@ Output Parameters: .N fortran @*/ -int MPI_File_write_all_end(MPI_File mpi_fh, void *buf, MPI_Status *status) +int MPI_File_write_all_end(MPI_File fh, const void *buf, MPI_Status *status) { int error_code; static char myname[] = "MPI_FILE_WRITE_ALL_END"; - error_code = MPIOI_File_write_all_end(mpi_fh, buf, myname, status); + error_code = MPIOI_File_write_all_end(fh, buf, myname, status); return error_code; } /* prevent multiple definitions of this routine */ #ifdef MPIO_BUILD_PROFILING -int MPIOI_File_write_all_end(MPI_File mpi_fh, - void *buf, +int MPIOI_File_write_all_end(MPI_File fh, + const void *buf, char *myname, MPI_Status *status) { int error_code; - ADIO_File fh; + ADIO_File adio_fh; MPIU_UNREFERENCED_ARG(buf); MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); - if (!(fh->split_coll_count)) + if (!(adio_fh->split_coll_count)) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_IO, "**iosplitcollnone", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ @@ -79,9 +79,9 @@ int MPIOI_File_write_all_end(MPI_File mpi_fh, valid by incrementing the ref count in the write_allb.c routine and decrement it here after setting the bytes */ if (status != MPI_STATUS_IGNORE) - *status = fh->split_status; + *status = adio_fh->split_status; #endif - fh->split_coll_count = 0; + adio_fh->split_coll_count = 0; error_code = MPI_SUCCESS; diff --git a/ompi/mca/io/romio/romio/mpi-io/write_at.c b/ompi/mca/io/romio/romio/mpi-io/write_at.c index 8a34bb66cb..16980ff84e 100644 --- a/ompi/mca/io/romio/romio/mpi-io/write_at.c +++ b/ompi/mca/io/romio/romio/mpi-io/write_at.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. @@ -25,7 +25,7 @@ /* status object not filled currently */ /*@ - MPI_File_write_at - Write using explict offset + MPI_File_write_at - Write using explicit offset Input Parameters: . fh - file handle (handle) @@ -39,9 +39,8 @@ Output Parameters: .N fortran @*/ -int MPI_File_write_at(MPI_File mpi_fh, MPI_Offset offset, void *buf, - int count, MPI_Datatype datatype, - MPI_Status *status) +int MPI_File_write_at(MPI_File fh, MPI_Offset offset, const void *buf, + int count, MPI_Datatype datatype, MPI_Status *status) { int error_code; static char myname[] = "MPI_FILE_WRITE_AT"; @@ -52,7 +51,7 @@ int MPI_File_write_at(MPI_File mpi_fh, MPI_Offset offset, void *buf, #endif /* MPI_hpux */ /* MPIOI_File_write() defined in mpi-io/write.c */ - error_code = MPIOI_File_write(mpi_fh, offset, ADIO_EXPLICIT_OFFSET, buf, + error_code = MPIOI_File_write(fh, offset, ADIO_EXPLICIT_OFFSET, buf, count, datatype, myname, status); #ifdef MPI_hpux diff --git a/ompi/mca/io/romio/romio/mpi-io/write_atall.c b/ompi/mca/io/romio/romio/mpi-io/write_atall.c index 0987df45b2..fda31ee4aa 100644 --- a/ompi/mca/io/romio/romio/mpi-io/write_atall.c +++ b/ompi/mca/io/romio/romio/mpi-io/write_atall.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -26,7 +26,7 @@ /* status object not filled currently */ /*@ - MPI_File_write_at_all - Collective write using explict offset + MPI_File_write_at_all - Collective write using explicit offset Input Parameters: . fh - file handle (handle) @@ -40,7 +40,7 @@ Output Parameters: .N fortran @*/ -int MPI_File_write_at_all(MPI_File mpi_fh, MPI_Offset offset, void *buf, +int MPI_File_write_at_all(MPI_File fh, MPI_Offset offset, const void *buf, int count, MPI_Datatype datatype, MPI_Status *status) { @@ -52,7 +52,7 @@ int MPI_File_write_at_all(MPI_File mpi_fh, MPI_Offset offset, void *buf, HPMP_IO_START(fl_xmpi, BLKMPIFILEWRITEATALL, TRDTBLOCK, fh, datatype, count); #endif /* MPI_hpux */ - error_code = MPIOI_File_write_all(mpi_fh, offset, ADIO_EXPLICIT_OFFSET, + error_code = MPIOI_File_write_all(fh, offset, ADIO_EXPLICIT_OFFSET, buf, count, datatype, myname, status); #ifdef MPI_hpux diff --git a/ompi/mca/io/romio/romio/mpi-io/write_ord.c b/ompi/mca/io/romio/romio/mpi-io/write_ord.c index 2ad4fd40bf..0b45e8f137 100644 --- a/ompi/mca/io/romio/romio/mpi-io/write_ord.c +++ b/ompi/mca/io/romio/romio/mpi-io/write_ord.c @@ -1,8 +1,9 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. * See COPYRIGHT notice in top-level directory. + * */ #include "mpioimpl.h" @@ -39,69 +40,81 @@ Output Parameters: .N fortran @*/ -int MPI_File_write_ordered(MPI_File mpi_fh, void *buf, int count, +int MPI_File_write_ordered(MPI_File fh, const void *buf, int count, MPI_Datatype datatype, MPI_Status *status) { int error_code, datatype_size, nprocs, myrank, incr; int source, dest; static char myname[] = "MPI_FILE_WRITE_ORDERED"; ADIO_Offset shared_fp; - ADIO_File fh; + ADIO_File adio_fh; + void *e32buf=NULL; + const void *xbuf; MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); - MPIO_CHECK_COUNT(fh, count, myname, error_code); - MPIO_CHECK_DATATYPE(fh, datatype, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); + MPIO_CHECK_COUNT(adio_fh, count, myname, error_code); + MPIO_CHECK_DATATYPE(adio_fh, datatype, myname, error_code); /* --END ERROR HANDLING-- */ MPI_Type_size(datatype, &datatype_size); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_INTEGRAL_ETYPE(fh, count, datatype_size, myname, error_code); - MPIO_CHECK_FS_SUPPORTS_SHARED(fh, myname, error_code); - MPIO_CHECK_COUNT_SIZE(fh, count, datatype_size, myname, error_code); + MPIO_CHECK_INTEGRAL_ETYPE(adio_fh, count, datatype_size, myname, error_code); + MPIO_CHECK_FS_SUPPORTS_SHARED(adio_fh, myname, error_code); + MPIO_CHECK_COUNT_SIZE(adio_fh, count, datatype_size, myname, error_code); /* --END ERROR HANDLING-- */ - ADIOI_TEST_DEFERRED(fh, myname, &error_code); + ADIOI_TEST_DEFERRED(adio_fh, myname, &error_code); - MPI_Comm_size(fh->comm, &nprocs); - MPI_Comm_rank(fh->comm, &myrank); + MPI_Comm_size(adio_fh->comm, &nprocs); + MPI_Comm_rank(adio_fh->comm, &myrank); - incr = (count*datatype_size)/fh->etype_size; + incr = (count*datatype_size)/adio_fh->etype_size; /* Use a message as a 'token' to order the operations */ source = myrank - 1; dest = myrank + 1; if (source < 0) source = MPI_PROC_NULL; if (dest >= nprocs) dest = MPI_PROC_NULL; - MPI_Recv(NULL, 0, MPI_BYTE, source, 0, fh->comm, MPI_STATUS_IGNORE); + MPI_Recv(NULL, 0, MPI_BYTE, source, 0, adio_fh->comm, MPI_STATUS_IGNORE); - ADIO_Get_shared_fp(fh, incr, &shared_fp, &error_code); + ADIO_Get_shared_fp(adio_fh, incr, &shared_fp, &error_code); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, myname, __LINE__, MPI_ERR_INTERN, "**iosharedfailed", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ - MPI_Send(NULL, 0, MPI_BYTE, dest, 0, fh->comm); + MPI_Send(NULL, 0, MPI_BYTE, dest, 0, adio_fh->comm); - ADIO_WriteStridedColl(fh, buf, count, datatype, ADIO_EXPLICIT_OFFSET, + xbuf = buf; + if (adio_fh->is_external32) { + error_code = MPIU_external32_buffer_setup(buf, count, datatype, &e32buf); + if (error_code != MPI_SUCCESS) + goto fn_exit; + + xbuf = e32buf; + } + + ADIO_WriteStridedColl(adio_fh, xbuf, count, datatype, ADIO_EXPLICIT_OFFSET, shared_fp, status, &error_code); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); /* --END ERROR HANDLING-- */ fn_exit: + if (e32buf != NULL) ADIOI_Free(e32buf); MPIU_THREAD_CS_EXIT(ALLFUNC,); /* FIXME: Check for error code from WriteStridedColl? */ diff --git a/ompi/mca/io/romio/romio/mpi-io/write_ordb.c b/ompi/mca/io/romio/romio/mpi-io/write_ordb.c index 4693eb5733..31a774d2ac 100644 --- a/ompi/mca/io/romio/romio/mpi-io/write_ordb.c +++ b/ompi/mca/io/romio/romio/mpi-io/write_ordb.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -36,76 +36,87 @@ Output Parameters: .N fortran @*/ -int MPI_File_write_ordered_begin(MPI_File mpi_fh, void *buf, int count, +int MPI_File_write_ordered_begin(MPI_File fh, const void *buf, int count, MPI_Datatype datatype) { int error_code, datatype_size, nprocs, myrank, incr; int source, dest; static char myname[] = "MPI_FILE_WRITE_ORDERED_BEGIN"; ADIO_Offset shared_fp; - ADIO_File fh; + ADIO_File adio_fh; + void *e32buf = NULL; + const void *xbuf=NULL; MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); - MPIO_CHECK_COUNT(fh, count, myname, error_code); - MPIO_CHECK_DATATYPE(fh, datatype, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); + MPIO_CHECK_COUNT(adio_fh, count, myname, error_code); + MPIO_CHECK_DATATYPE(adio_fh, datatype, myname, error_code); - if (fh->split_coll_count) + if (adio_fh->split_coll_count) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_IO, "**iosplitcoll", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ - fh->split_coll_count = 1; + adio_fh->split_coll_count = 1; MPI_Type_size(datatype, &datatype_size); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_INTEGRAL_ETYPE(fh, count, datatype_size, myname, error_code); - MPIO_CHECK_FS_SUPPORTS_SHARED(fh, myname, error_code); - MPIO_CHECK_COUNT_SIZE(fh, count, datatype_size, myname, error_code); + MPIO_CHECK_INTEGRAL_ETYPE(adio_fh, count, datatype_size, myname, error_code); + MPIO_CHECK_FS_SUPPORTS_SHARED(adio_fh, myname, error_code); + MPIO_CHECK_COUNT_SIZE(adio_fh, count, datatype_size, myname, error_code); /* --END ERROR HANDLING-- */ - ADIOI_TEST_DEFERRED(fh, myname, &error_code); + ADIOI_TEST_DEFERRED(adio_fh, myname, &error_code); - MPI_Comm_size(fh->comm, &nprocs); - MPI_Comm_rank(fh->comm, &myrank); + MPI_Comm_size(adio_fh->comm, &nprocs); + MPI_Comm_rank(adio_fh->comm, &myrank); - incr = (count*datatype_size)/fh->etype_size; + incr = (count*datatype_size)/adio_fh->etype_size; /* Use a message as a 'token' to order the operations */ source = myrank - 1; dest = myrank + 1; if (source < 0) source = MPI_PROC_NULL; if (dest >= nprocs) dest = MPI_PROC_NULL; - MPI_Recv(NULL, 0, MPI_BYTE, source, 0, fh->comm, MPI_STATUS_IGNORE); + MPI_Recv(NULL, 0, MPI_BYTE, source, 0, adio_fh->comm, MPI_STATUS_IGNORE); - ADIO_Get_shared_fp(fh, incr, &shared_fp, &error_code); + ADIO_Get_shared_fp(adio_fh, incr, &shared_fp, &error_code); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, myname, __LINE__, MPI_ERR_INTERN, "**iosharedfailed", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ - MPI_Send(NULL, 0, MPI_BYTE, dest, 0, fh->comm); + MPI_Send(NULL, 0, MPI_BYTE, dest, 0, adio_fh->comm); - ADIO_WriteStridedColl(fh, buf, count, datatype, ADIO_EXPLICIT_OFFSET, - shared_fp, &fh->split_status, &error_code); + xbuf = buf; + if (adio_fh->is_external32) { + error_code = MPIU_external32_buffer_setup(buf, count, datatype, &e32buf); + if (error_code != MPI_SUCCESS) + goto fn_exit; + + xbuf = e32buf; + } + + ADIO_WriteStridedColl(adio_fh, xbuf, count, datatype, ADIO_EXPLICIT_OFFSET, + shared_fp, &adio_fh->split_status, &error_code); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); /* --END ERROR HANDLING-- */ fn_exit: diff --git a/ompi/mca/io/romio/romio/mpi-io/write_orde.c b/ompi/mca/io/romio/romio/mpi-io/write_orde.c index 2044a8c868..75836fb160 100644 --- a/ompi/mca/io/romio/romio/mpi-io/write_orde.c +++ b/ompi/mca/io/romio/romio/mpi-io/write_orde.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -35,36 +35,36 @@ Output Parameters: .N fortran @*/ -int MPI_File_write_ordered_end(MPI_File mpi_fh, void *buf, MPI_Status *status) +int MPI_File_write_ordered_end(MPI_File fh, const void *buf, MPI_Status *status) { int error_code; static char myname[] = "MPI_FILE_WRITE_ORDERED_END"; - ADIO_File fh; + ADIO_File adio_fh; MPIU_UNREFERENCED_ARG(buf); MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); - if (!(fh->split_coll_count)) + if (!(adio_fh->split_coll_count)) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_IO, "**iosplitcollnone", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ #ifdef HAVE_STATUS_SET_BYTES if (status != MPI_STATUS_IGNORE) - *status = fh->split_status; + *status = adio_fh->split_status; #endif - fh->split_coll_count = 0; + adio_fh->split_coll_count = 0; fn_exit: diff --git a/ompi/mca/io/romio/romio/mpi-io/write_sh.c b/ompi/mca/io/romio/romio/mpi-io/write_sh.c index a1950505fa..27875c9ed5 100644 --- a/ompi/mca/io/romio/romio/mpi-io/write_sh.c +++ b/ompi/mca/io/romio/romio/mpi-io/write_sh.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * Copyright (C) 1997 University of Chicago. @@ -39,29 +39,31 @@ Output Parameters: .N fortran @*/ -int MPI_File_write_shared(MPI_File mpi_fh, void *buf, int count, +int MPI_File_write_shared(MPI_File fh, const void *buf, int count, MPI_Datatype datatype, MPI_Status *status) { int error_code, bufsize, buftype_is_contig, filetype_is_contig; static char myname[] = "MPI_FILE_READ_SHARED"; int datatype_size, incr; ADIO_Offset off, shared_fp; - ADIO_File fh; + ADIO_File adio_fh; + void *e32buf = NULL; + const void *xbuf = NULL; MPIU_THREAD_CS_ENTER(ALLFUNC,); - fh = MPIO_File_resolve(mpi_fh); + adio_fh = MPIO_File_resolve(fh); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_FILE_HANDLE(fh, myname, error_code); - MPIO_CHECK_COUNT(fh, count, myname, error_code); - MPIO_CHECK_DATATYPE(fh, datatype, myname, error_code); + MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); + MPIO_CHECK_COUNT(adio_fh, count, myname, error_code); + MPIO_CHECK_DATATYPE(adio_fh, datatype, myname, error_code); /* --END ERROR HANDLING-- */ MPI_Type_size(datatype, &datatype_size); /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_COUNT_SIZE(fh, count, datatype_size, myname, error_code); + MPIO_CHECK_COUNT_SIZE(adio_fh, count, datatype_size, myname, error_code); /* --END ERROR HANDLING-- */ if (count*datatype_size == 0) { @@ -73,61 +75,71 @@ int MPI_File_write_shared(MPI_File mpi_fh, void *buf, int count, } /* --BEGIN ERROR HANDLING-- */ - MPIO_CHECK_INTEGRAL_ETYPE(fh, count, datatype_size, myname, error_code); - MPIO_CHECK_FS_SUPPORTS_SHARED(fh, myname, error_code); + MPIO_CHECK_INTEGRAL_ETYPE(adio_fh, count, datatype_size, myname, error_code); + MPIO_CHECK_FS_SUPPORTS_SHARED(adio_fh, myname, error_code); /* --END ERROR HANDLING-- */ ADIOI_Datatype_iscontig(datatype, &buftype_is_contig); - ADIOI_Datatype_iscontig(fh->filetype, &filetype_is_contig); + ADIOI_Datatype_iscontig(adio_fh->filetype, &filetype_is_contig); - ADIOI_TEST_DEFERRED(fh, myname, &error_code); + ADIOI_TEST_DEFERRED(adio_fh, myname, &error_code); - incr = (count*datatype_size)/fh->etype_size; + incr = (count*datatype_size)/adio_fh->etype_size; - ADIO_Get_shared_fp(fh, incr, &shared_fp, &error_code); + ADIO_Get_shared_fp(adio_fh, incr, &shared_fp, &error_code); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, myname, __LINE__, MPI_ERR_INTERN, "**iosharedfailed", 0); - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ + xbuf = buf; + if (adio_fh->is_external32) { + error_code = MPIU_external32_buffer_setup(buf, count, datatype, &e32buf); + if (error_code != MPI_SUCCESS) + goto fn_exit; + + xbuf = e32buf; + } + if (buftype_is_contig && filetype_is_contig) { /* convert bufocunt and shared_fp to bytes */ bufsize = datatype_size * count; - off = fh->disp + fh->etype_size * shared_fp; + off = adio_fh->disp + adio_fh->etype_size * shared_fp; /* if atomic mode requested, lock (exclusive) the region, because there could be a concurrent noncontiguous request. On NFS, locking is done in the ADIO_WriteContig.*/ - if ((fh->atomicity) && (fh->file_system != ADIO_NFS)) - ADIOI_WRITE_LOCK(fh, off, SEEK_SET, bufsize); + if ((adio_fh->atomicity) && (adio_fh->file_system != ADIO_NFS)) + ADIOI_WRITE_LOCK(adio_fh, off, SEEK_SET, bufsize); - ADIO_WriteContig(fh, buf, count, datatype, ADIO_EXPLICIT_OFFSET, + ADIO_WriteContig(adio_fh, xbuf, count, datatype, ADIO_EXPLICIT_OFFSET, off, status, &error_code); - if ((fh->atomicity) && (fh->file_system != ADIO_NFS)) - ADIOI_UNLOCK(fh, off, SEEK_SET, bufsize); + if ((adio_fh->atomicity) && (adio_fh->file_system != ADIO_NFS)) + ADIOI_UNLOCK(adio_fh, off, SEEK_SET, bufsize); } else { - ADIO_WriteStrided(fh, buf, count, datatype, ADIO_EXPLICIT_OFFSET, + ADIO_WriteStrided(adio_fh, xbuf, count, datatype, ADIO_EXPLICIT_OFFSET, shared_fp, status, &error_code); /* For strided and atomic mode, locking is done in ADIO_WriteStrided */ } /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) - error_code = MPIO_Err_return_file(fh, error_code); + error_code = MPIO_Err_return_file(adio_fh, error_code); /* --END ERROR HANDLING-- */ fn_exit: + if (e32buf != NULL) ADIOI_Free(e32buf); MPIU_THREAD_CS_EXIT(ALLFUNC,); return error_code; } diff --git a/ompi/mca/io/romio/romio/mpi2-other/array/Makefile.in b/ompi/mca/io/romio/romio/mpi2-other/array/Makefile.in deleted file mode 100644 index 41a366e398..0000000000 --- a/ompi/mca/io/romio/romio/mpi2-other/array/Makefile.in +++ /dev/null @@ -1,80 +0,0 @@ -CC = @CC@ -AR = @AR@ -LIBNAME = @LIBNAME@ -RANLIB = @RANLIB@ -srcdir = @srcdir@ -CC_SHL = @CC_SHL@ -SHLIBNAME = @SHLIBNAME@ - -INCLUDE_DIR = -I@MPI_INCLUDE_DIR@ -I../../include -I${srcdir}/../../mpi-io -I${srcdir}/../../adio/include -I../../adio/include -CFLAGS = @CPPFLAGS@ @CFLAGS@ $(MPIOPROFILE) $(INCLUDE_DIR) - -top_builddir = @master_topbuild_dir@ -LIBTOOL = @LIBTOOL@ -C_COMPILE_SHL = $(CC_SHL) - -@VPATH@ - -MPIO_OBJECTS = subarray.o darray.o - -MPIO_TMP_POBJECTS = subarray.p darray.p - -MPIO_REAL_POBJECTS = _subarray.o _darray.o - -all: $(LIBNAME) - @if [ "@ENABLE_SHLIB@" != "none" ] ; then \ - $(MAKE) $(SHLIBNAME).la ;\ - fi - -.SUFFIXES: $(SUFFIXES) .p .sp .lo - -.c.o: - $(CC) $(CFLAGS) -c $< -.c.lo: - $(C_COMPILE_SHL) $(CFLAGS) -c $< -o _s$*.o - @mv -f _s$*.o $*.lo - -.c.p: - @cp $(srcdir)/$*.c _$*.c - $(CC) $(CFLAGS) -c _$*.c - @rm -f _$*.c - -.c.sp: - $(C_COMPILE_SHL) $(CFLAGS) -c $< -o _$*.lo - -profile: $(MPIO_REAL_POBJECTS) - $(AR) $(LIBNAME) $(MPIO_REAL_POBJECTS) - $(RANLIB) $(LIBNAME) - @if [ "@ENABLE_SHLIB@" != "none" ] ; then \ - $(MAKE) P$(SHLIBNAME).la ;\ - fi - @rm -f _*.o - -$(LIBNAME): $(MPIO_OBJECTS) - $(AR) $(LIBNAME) $(MPIO_OBJECTS) - $(RANLIB) $(LIBNAME) - -MPIO_LOOBJECTS = $(MPIO_OBJECTS:.o=.lo) -$(SHLIBNAME).la: $(MPIO_LOOBJECTS) - $(AR) $(SHLIBNAME).la $(MPIO_LOOBJECTS) - -# -------------------------------------------------------------------------- -# We use P$(SHLBNAME) simply to distinguish the regular lib build from the -# profiling library build -MPIO_LOPOBJECTS = $(MPIO_REAL_POBJECTS:.o=.lo) -MPIO_TMP_LOPOBJECTS = ${MPIO_TMP_POBJECTS:.p=.sp} -P$(SHLIBNAME).la: $(MPIO_TMP_LOPOBJECTS) - $(AR) $(SHLIBNAME).la $(MPIO_LOPOBJECTS) -# -------------------------------------------------------------------------- - -clean: - @rm -f *.o *.lo *.gcno *.gcda *.bb *.bbg - @rm -f ${srcdir}/*.gcno ${srcdir}/*.gcda - @rm -f ${srcdir}/*.bb ${srcdir}/*.bbg - -# Rules for the profiling objects -_subarray.o: subarray.c - $(CC) $(CFLAGS) -c $(srcdir)/subarray.c -o _subarray.o -_darray.o: darray.c - $(CC) $(CFLAGS) -c $(srcdir)/darray.c -o _darray.o - diff --git a/ompi/mca/io/romio/romio/mpi2-other/array/darray.c b/ompi/mca/io/romio/romio/mpi2-other/array/darray.c deleted file mode 100644 index 944e748384..0000000000 --- a/ompi/mca/io/romio/romio/mpi2-other/array/darray.c +++ /dev/null @@ -1,210 +0,0 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ -/* - * - * Copyright (C) 1997 University of Chicago. - * See COPYRIGHT notice in top-level directory. - */ - -#include "mpioimpl.h" - -#ifdef HAVE_WEAK_SYMBOLS - -#if defined(HAVE_PRAGMA_WEAK) -#pragma weak MPI_Type_create_darray = PMPI_Type_create_darray -#elif defined(HAVE_PRAGMA_HP_SEC_DEF) -#pragma _HP_SECONDARY_DEF PMPI_Type_create_darray MPI_Type_create_darray -#elif defined(HAVE_PRAGMA_CRI_DUP) -#pragma _CRI duplicate MPI_Type_create_darray as PMPI_Type_create_darray -/* end of weak pragmas */ -#endif - -/* Include mapping from MPI->PMPI */ -#define MPIO_BUILD_PROFILING -#include "mpioprof.h" -#endif - -/*@ -MPI_Type_create_darray - Creates a datatype corresponding to a distributed, multidimensional array - -Input Parameters: -. size - size of process group (positive integer) -. rank - rank in process group (nonnegative integer) -. ndims - number of array dimensions as well as process grid dimensions (positive integer) -. array_of_gsizes - number of elements of type oldtype in each dimension of global array (array of positive integers) -. array_of_distribs - distribution of array in each dimension (array of state) -. array_of_dargs - distribution argument in each dimension (array of positive integers) -. array_of_psizes - size of process grid in each dimension (array of positive integers) -. order - array storage order flag (state) -. oldtype - old datatype (handle) - -Output Parameters: -. newtype - new datatype (handle) - -.N fortran -@*/ -int MPI_Type_create_darray(int size, int rank, int ndims, - int *array_of_gsizes, int *array_of_distribs, - int *array_of_dargs, int *array_of_psizes, - int order, MPI_Datatype oldtype, - MPI_Datatype *newtype) -{ - int err, error_code; - MPI_Datatype type_old, type_new, types[3]; - int procs, tmp_rank, i, tmp_size, blklens[3], *coords; - MPI_Aint *st_offsets, orig_extent, disps[3], size_with_aint; - MPI_Offset size_with_offset; - static char myname[] = "MPI_TYPE_CREATE_DARRAY"; - - /* --BEGIN ERROR HANDLING-- */ - if (size <= 0) { - error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, - myname, __LINE__, MPI_ERR_ARG, - "Invalid size argument", 0); - return MPIO_Err_return_comm(MPI_COMM_SELF, error_code); - } - if (rank < 0) { - error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, - myname, __LINE__, MPI_ERR_ARG, - "Invalid rank argument", 0); - return MPIO_Err_return_comm(MPI_COMM_SELF, error_code); - } - if (ndims <= 0) { - error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, - myname, __LINE__, MPI_ERR_ARG, - "Invalid ndoms argument", 0); - return MPIO_Err_return_comm(MPI_COMM_SELF, error_code); - } - if (array_of_gsizes <= (int *) 0) { - error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, - myname, __LINE__, MPI_ERR_ARG, - "Invalid array_of_gsizes argument", 0); - return MPIO_Err_return_comm(MPI_COMM_SELF, error_code); - } - if (array_of_distribs <= (int *) 0) { - error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, - myname, __LINE__, MPI_ERR_ARG, - "Invalid array_of_distribs argument", 0); - return MPIO_Err_return_comm(MPI_COMM_SELF, error_code); - } - if (array_of_dargs <= (int *) 0) { - error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, - myname, __LINE__, MPI_ERR_ARG, - "Invalid array_of_dargs argument", 0); - return MPIO_Err_return_comm(MPI_COMM_SELF, error_code); - } - if (array_of_psizes <= (int *) 0) { - error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, - myname, __LINE__, MPI_ERR_ARG, - "Invalid array_of_psizes argument", 0); - return MPIO_Err_return_comm(MPI_COMM_SELF, error_code); - } - - for (i=0; iPMPI */ -#include "mpioprof.h" -#endif - -#ifdef FORTRANCAPS -#define mpi_type_create_darray_ PMPI_TYPE_CREATE_DARRAY -#elif defined(FORTRANDOUBLEUNDERSCORE) -#define mpi_type_create_darray_ pmpi_type_create_darray__ -#elif !defined(FORTRANUNDERSCORE) -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF pmpi_type_create_darray pmpi_type_create_darray_ -#endif -#define mpi_type_create_darray_ pmpi_type_create_darray -#else -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF pmpi_type_create_darray_ pmpi_type_create_darray -#endif -#define mpi_type_create_darray_ pmpi_type_create_darray_ -#endif - -#else - -#ifdef FORTRANCAPS -#define mpi_type_create_darray_ MPI_TYPE_CREATE_DARRAY -#elif defined(FORTRANDOUBLEUNDERSCORE) -#define mpi_type_create_darray_ mpi_type_create_darray__ -#elif !defined(FORTRANUNDERSCORE) -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF mpi_type_create_darray mpi_type_create_darray_ -#endif -#define mpi_type_create_darray_ mpi_type_create_darray -#else -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF mpi_type_create_darray_ mpi_type_create_darray -#endif -#endif -#endif - -#ifdef MPIHP -/* Prototype to keep compiler happy */ -void mpi_type_create_darray_(int *size,int *rank,int *ndims, - int *array_of_gsizes,int *array_of_distribs, - int *array_of_dargs,int *array_of_psizes, - int *order, MPI_Fint *oldtype, - MPI_Fint *newtype, int *ierr ); - -void mpi_type_create_darray_(int *size,int *rank,int *ndims, - int *array_of_gsizes,int *array_of_distribs, - int *array_of_dargs,int *array_of_psizes, - int *order, MPI_Fint *oldtype, - MPI_Fint *newtype, int *ierr ) -{ - MPI_Datatype oldtype_c, newtype_c; - - oldtype_c = MPI_Type_f2c(*oldtype); - - *ierr = MPI_Type_create_darray(*size,*rank,*ndims,array_of_gsizes,array_of_distribs,array_of_dargs,array_of_psizes,*order,oldtype_c,&newtype_c); - - *newtype = MPI_Type_c2f(newtype_c); -} - -#else -/* Prototype to keep compiler happy */ -FORTRAN_API void FORT_CALL void mpi_type_create_darray_(MPI_Fint *size,MPI_Fint *rank,MPI_Fint *ndims, - MPI_Fint *array_of_gsizes,MPI_Fint *array_of_distribs, - MPI_Fint *array_of_dargs,MPI_Fint *array_of_psizes, - MPI_Fint *order,MPI_Fint *oldtype, - MPI_Fint *newtype, MPI_Fint *ierr); - -FORTRAN_API void FORT_CALL void mpi_type_create_darray_(MPI_Fint *size,MPI_Fint *rank,MPI_Fint *ndims, - MPI_Fint *array_of_gsizes,MPI_Fint *array_of_distribs, - MPI_Fint *array_of_dargs,MPI_Fint *array_of_psizes, - MPI_Fint *order,MPI_Fint *oldtype, - MPI_Fint *newtype, MPI_Fint *ierr ) -{ - *ierr = MPI_Type_create_darray(*size,*rank,*ndims,array_of_gsizes,array_of_distribs,array_of_dargs,array_of_psizes,*order,*oldtype,newtype); -} -#endif diff --git a/ompi/mca/io/romio/romio/mpi2-other/array/fortran/subarrayf.c b/ompi/mca/io/romio/romio/mpi2-other/array/fortran/subarrayf.c deleted file mode 100644 index 2aab961d53..0000000000 --- a/ompi/mca/io/romio/romio/mpi2-other/array/fortran/subarrayf.c +++ /dev/null @@ -1,127 +0,0 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ -/* - * - * Copyright (C) 1997 University of Chicago. - * See COPYRIGHT notice in top-level directory. - */ - -#include "adio.h" -#include "mpio.h" - - -#if defined(MPIO_BUILD_PROFILING) || defined(HAVE_WEAK_SYMBOLS) - -#if defined(HAVE_WEAK_SYMBOLS) -#if defined(HAVE_PRAGMA_WEAK) -#if defined(FORTRANCAPS) -extern FORTRAN_API void FORT_CALL MPI_TYPE_CREATE_SUBARRAY(MPI_Fint *, MPI_Fint *, MPI_Fint *, MPI_Fint *, MPI_Fint *, MPI_Fint *, MPI_Fint *, MPI_Fint *); -#pragma weak MPI_TYPE_CREATE_SUBARRAY = PMPI_TYPE_CREATE_SUBARRAY -#elif defined(FORTRANDOUBLEUNDERSCORE) -extern FORTRAN_API void FORT_CALL mpi_type_create_subarray__(MPI_Fint *, MPI_Fint *, MPI_Fint *, MPI_Fint *, MPI_Fint *, MPI_Fint *, MPI_Fint *, MPI_Fint *); -#pragma weak mpi_type_create_subarray__ = pmpi_type_create_subarray__ -#elif !defined(FORTRANUNDERSCORE) -extern FORTRAN_API void FORT_CALL mpi_type_create_subarray(MPI_Fint *, MPI_Fint *, MPI_Fint *, MPI_Fint *, MPI_Fint *, MPI_Fint *, MPI_Fint *, MPI_Fint *); -#pragma weak mpi_type_create_subarray = pmpi_type_create_subarray -#else -extern FORTRAN_API void FORT_CALL mpi_type_create_subarray_(MPI_Fint *, MPI_Fint *, MPI_Fint *, MPI_Fint *, MPI_Fint *, MPI_Fint *, MPI_Fint *, MPI_Fint *); -#pragma weak mpi_type_create_subarray_ = pmpi_type_create_subarray_ -#endif - -#elif defined(HAVE_PRAGMA_HP_SEC_DEF) -#if defined(FORTRANCAPS) -#pragma _HP_SECONDARY_DEF PMPI_TYPE_CREATE_SUBARRAY MPI_TYPE_CREATE_SUBARRAY -#elif defined(FORTRANDOUBLEUNDERSCORE) -#pragma _HP_SECONDARY_DEF pmpi_type_create_subarray__ mpi_type_create_subarray__ -#elif !defined(FORTRANUNDERSCORE) -#pragma _HP_SECONDARY_DEF pmpi_type_create_subarray mpi_type_create_subarray -#else -#pragma _HP_SECONDARY_DEF pmpi_type_create_subarray_ mpi_type_create_subarray_ -#endif - -#elif defined(HAVE_PRAGMA_CRI_DUP) -#if defined(FORTRANCAPS) -#pragma _CRI duplicate MPI_TYPE_CREATE_SUBARRAY as PMPI_TYPE_CREATE_SUBARRAY -#elif defined(FORTRANDOUBLEUNDERSCORE) -#pragma _CRI duplicate mpi_type_create_subarray__ as pmpi_type_create_subarray__ -#elif !defined(FORTRANUNDERSCORE) -#pragma _CRI duplicate mpi_type_create_subarray as pmpi_type_create_subarray -#else -#pragma _CRI duplicate mpi_type_create_subarray_ as pmpi_type_create_subarray_ -#endif - -/* end of weak pragmas */ -#endif -/* Include mapping from MPI->PMPI */ -#include "mpioprof.h" -#endif - -#ifdef FORTRANCAPS -#define mpi_type_create_subarray_ PMPI_TYPE_CREATE_SUBARRAY -#elif defined(FORTRANDOUBLEUNDERSCORE) -#define mpi_type_create_subarray_ pmpi_type_create_subarray__ -#elif !defined(FORTRANUNDERSCORE) -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF pmpi_type_create_subarray pmpi_type_create_subarray_ -#endif -#define mpi_type_create_subarray_ pmpi_type_create_subarray -#else -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF pmpi_type_create_subarray_ pmpi_type_create_subarray -#endif -#define mpi_type_create_subarray_ pmpi_type_create_subarray_ -#endif - -#else - -#ifdef FORTRANCAPS -#define mpi_type_create_subarray_ MPI_TYPE_CREATE_SUBARRAY -#elif defined(FORTRANDOUBLEUNDERSCORE) -#define mpi_type_create_subarray_ mpi_type_create_subarray__ -#elif !defined(FORTRANUNDERSCORE) -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF mpi_type_create_subarray mpi_type_create_subarray_ -#endif -#define mpi_type_create_subarray_ mpi_type_create_subarray -#else -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF mpi_type_create_subarray_ mpi_type_create_subarray -#endif -#endif -#endif - -#ifdef MPIHP -/* Prototype to keep compiler happy */ -void mpi_type_create_subarray_(int *ndims,int *array_of_sizes, - int *array_of_subsizes,int *array_of_starts, - int *order,MPI_Fint *oldtype, - MPI_Fint *newtype, int *ierr ); - -void mpi_type_create_subarray_(int *ndims,int *array_of_sizes, - int *array_of_subsizes,int *array_of_starts, - int *order,MPI_Fint *oldtype, - MPI_Fint *newtype, int *ierr ) -{ - MPI_Datatype oldtype_c, newtype_c; - - oldtype_c = MPI_Type_f2c(*oldtype); - - *ierr = MPI_Type_create_subarray(*ndims,array_of_sizes,array_of_subsizes,array_of_starts,*order,oldtype_c,&newtype_c); - *newtype = MPI_Type_c2f(newtype_c); -} - -#else - -/* Prototype to keep compiler happy */ -FORTRAN_API void FORT_CALL void mpi_type_create_subarray_(MPI_Fint *ndims,MPI_Fint *array_of_sizes, - MPI_Fint *array_of_subsizes,MPI_Fint *array_of_starts, - MPI_Fint *order,MPI_Fint *oldtype, - MPI_Fint *newtype, MPI_Fint *ierr ); - -FORTRAN_API void FORT_CALL void mpi_type_create_subarray_(MPI_Fint *ndims,MPI_Fint *array_of_sizes, - MPI_Fint *array_of_subsizes,MPI_Fint *array_of_starts, - MPI_Fint *order,MPI_Fint *oldtype, - MPI_Fint *newtype, MPI_Fint *ierr ) -{ -*ierr = MPI_Type_create_subarray(*ndims,array_of_sizes,array_of_subsizes,array_of_starts,*order,*oldtype,newtype); -} -#endif diff --git a/ompi/mca/io/romio/romio/mpi2-other/array/subarray.c b/ompi/mca/io/romio/romio/mpi2-other/array/subarray.c deleted file mode 100644 index b8ee8ec6f2..0000000000 --- a/ompi/mca/io/romio/romio/mpi2-other/array/subarray.c +++ /dev/null @@ -1,175 +0,0 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ -/* - * Copyright (C) 1997 University of Chicago. - * See COPYRIGHT notice in top-level directory. - */ - -#include "mpioimpl.h" - -#ifdef HAVE_WEAK_SYMBOLS - -#if defined(HAVE_PRAGMA_WEAK) -#pragma weak MPI_Type_create_subarray = PMPI_Type_create_subarray -#elif defined(HAVE_PRAGMA_HP_SEC_DEF) -#pragma _HP_SECONDARY_DEF PMPI_Type_create_subarray MPI_Type_create_subarray -#elif defined(HAVE_PRAGMA_CRI_DUP) -#pragma _CRI duplicate MPI_Type_create_subarray as PMPI_Type_create_subarray -/* end of weak pragmas */ -#endif - -/* Include mapping from MPI->PMPI */ -#define MPIO_BUILD_PROFILING -#include "mpioprof.h" -#endif - -/*@ -MPI_Type_create_subarray - Creates a datatype describing a subarray of a multidimensional array - -Input Parameters: -. ndims - number of array dimensions (positive integer) -. array_of_sizes - number of elements of type oldtype in each dimension of the full array (array of positive integers) -. array_of_subsizes - number of elements of type oldtype in each dimension of the subarray (array of positive integers) -. array_of_starts - starting coordinates of the subarray in each dimension (array of nonnegative integers) -. order - array storage order flag (state) -. oldtype - old datatype (handle) - -Output Parameters: -. newtype - new datatype (handle) - -.N fortran -@*/ -int MPI_Type_create_subarray(int ndims, int *array_of_sizes, - int *array_of_subsizes, int *array_of_starts, - int order, MPI_Datatype oldtype, - MPI_Datatype *newtype) -{ - MPI_Aint extent, disps[3], size, size_with_aint; - int i, blklens[3], err; - MPI_Datatype tmp1, tmp2, types[3]; - MPI_Offset size_with_offset; - - /* --BEGIN ERROR HANDLING-- */ - if (ndims <= 0) { - error_code = MPIO_Err_create_code(MPI_SUCCESS, - MPIR_ERR_RECOVERABLE, - myname, __LINE__, MPI_ERR_ARG, - "Invalid ndims argument", 0); - return MPIO_Err_return_comm(MPI_COMM_SELF, error_code); - } - if (array_of_sizes <= (int *) 0) { - error_code = MPIO_Err_create_code(MPI_SUCCESS, - MPIR_ERR_RECOVERABLE, - myname, __LINE__, MPI_ERR_ARG, - "Invalid array_of_sizes argument", - 0); - return MPIO_Err_return_comm(MPI_COMM_SELF, error_code); - } - if (array_of_subsizes <= (int *) 0) { - error_code = MPIO_Err_create_code(MPI_SUCCESS, - MPIR_ERR_RECOVERABLE, - myname, __LINE__, MPI_ERR_ARG, - "Invalid array_of_subsizes argument", - 0); - return MPIO_Err_return_comm(MPI_COMM_SELF, error_code); - } - if (array_of_starts <= (int *) 0) { - error_code = MPIO_Err_create_code(MPI_SUCCESS, - MPIR_ERR_RECOVERABLE, - myname, __LINE__, MPI_ERR_ARG, - "Invalid array_of_starts argument", - 0); - return MPIO_Err_return_comm(MPI_COMM_SELF, error_code); - } - - for (i=0; i array_of_sizes[i]) { - error_code = MPIO_Err_create_code(MPI_SUCCESS, - MPIR_ERR_RECOVERABLE, - myname, __LINE__, MPI_ERR_ARG, - "Invalid subsize argument", 0); - return MPIO_Err_return_comm(MPI_COMM_SELF, error_code); - } - if (array_of_starts[i] > (array_of_sizes[i] - array_of_subsizes[i])) { - error_code = MPIO_Err_create_code(MPI_SUCCESS, - MPIR_ERR_RECOVERABLE, - myname, __LINE__, MPI_ERR_ARG, - "Invalid start argument", 0); - return MPIO_Err_return_comm(MPI_COMM_SELF, error_code); - } - } - - /* order argument checked below */ - - if (oldtype == MPI_DATATYPE_NULL) { - error_code = MPIO_Err_create_code(MPI_SUCCESS, - MPIR_ERR_RECOVERABLE, - myname, __LINE__, MPI_ERR_ARG, - "Invalid type argument", 0); - return MPIO_Err_return_comm(MPI_COMM_SELF, error_code); - } - - MPI_Type_extent(oldtype, &extent); - -/* check if MPI_Aint is large enough for size of global array. - if not, complain. */ - - size_with_aint = extent; - for (i=0; iPMPI */ -#include "mpioprof.h" -#endif - -#else - -#ifdef FORTRANCAPS -#define mpi_info_create_ MPI_INFO_CREATE -#elif defined(FORTRANDOUBLEUNDERSCORE) -#define mpi_info_create_ mpi_info_create__ -#elif !defined(FORTRANUNDERSCORE) -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF mpi_info_create mpi_info_create_ -#endif -#define mpi_info_create_ mpi_info_create -#else -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF mpi_info_create_ mpi_info_create -#endif -#endif -#endif - -void mpi_info_create_(MPI_Fint *info, int *ierr ) -{ - MPI_Info info_c; - - *ierr = MPI_Info_create(&info_c); - *info = MPI_Info_c2f(info_c); -} diff --git a/ompi/mca/io/romio/romio/mpi2-other/info/fortran/info_deletef.c b/ompi/mca/io/romio/romio/mpi2-other/info/fortran/info_deletef.c deleted file mode 100644 index 039b85b549..0000000000 --- a/ompi/mca/io/romio/romio/mpi2-other/info/fortran/info_deletef.c +++ /dev/null @@ -1,120 +0,0 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ -/* - * - * Copyright (C) 1997 University of Chicago. - * See COPYRIGHT notice in top-level directory. - */ - -#include "mpio.h" -#include "adio.h" - - -#if defined(MPIO_BUILD_PROFILING) || defined(HAVE_WEAK_SYMBOLS) -#ifdef FORTRANCAPS -#define mpi_info_delete_ PMPI_INFO_DELETE -#elif defined(FORTRANDOUBLEUNDERSCORE) -#define mpi_info_delete_ pmpi_info_delete__ -#elif !defined(FORTRANUNDERSCORE) -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF pmpi_info_delete pmpi_info_delete_ -#endif -#define mpi_info_delete_ pmpi_info_delete -#else -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF pmpi_info_delete_ pmpi_info_delete -#endif -#define mpi_info_delete_ pmpi_info_delete_ -#endif - -#if defined(HAVE_WEAK_SYMBOLS) -#if defined(HAVE_PRAGMA_WEAK) -#if defined(FORTRANCAPS) -#pragma weak MPI_INFO_DELETE = PMPI_INFO_DELETE -#elif defined(FORTRANDOUBLEUNDERSCORE) -#pragma weak mpi_info_delete__ = pmpi_info_delete__ -#elif !defined(FORTRANUNDERSCORE) -#pragma weak mpi_info_delete = pmpi_info_delete -#else -#pragma weak mpi_info_delete_ = pmpi_info_delete_ -#endif - -#elif defined(HAVE_PRAGMA_HP_SEC_DEF) -#if defined(FORTRANCAPS) -#pragma _HP_SECONDARY_DEF PMPI_INFO_DELETE MPI_INFO_DELETE -#elif defined(FORTRANDOUBLEUNDERSCORE) -#pragma _HP_SECONDARY_DEF pmpi_info_delete__ mpi_info_delete__ -#elif !defined(FORTRANUNDERSCORE) -#pragma _HP_SECONDARY_DEF pmpi_info_delete mpi_info_delete -#else -#pragma _HP_SECONDARY_DEF pmpi_info_delete_ mpi_info_delete_ -#endif - -#elif defined(HAVE_PRAGMA_CRI_DUP) -#if defined(FORTRANCAPS) -#pragma _CRI duplicate MPI_INFO_DELETE as PMPI_INFO_DELETE -#elif defined(FORTRANDOUBLEUNDERSCORE) -#pragma _CRI duplicate mpi_info_delete__ as pmpi_info_delete__ -#elif !defined(FORTRANUNDERSCORE) -#pragma _CRI duplicate mpi_info_delete as pmpi_info_delete -#else -#pragma _CRI duplicate mpi_info_delete_ as pmpi_info_delete_ -#endif - -/* end of weak pragmas */ -#endif -/* Include mapping from MPI->PMPI */ -#include "mpioprof.h" -#endif - -#else - -#ifdef FORTRANCAPS -#define mpi_info_delete_ MPI_INFO_DELETE -#elif defined(FORTRANDOUBLEUNDERSCORE) -#define mpi_info_delete_ mpi_info_delete__ -#elif !defined(FORTRANUNDERSCORE) -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF mpi_info_delete mpi_info_delete_ -#endif -#define mpi_info_delete_ mpi_info_delete -#else -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF mpi_info_delete_ mpi_info_delete -#endif -#endif -#endif - -void mpi_info_delete_(MPI_Fint *info, char *key, int *ierr, int keylen) -{ - MPI_Info info_c; - char *newkey; - int new_keylen, lead_blanks, i; - - if (key <= (char *) 0) { - FPRINTF(stderr, "MPI_Info_delete: key is an invalid address\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - /* strip leading and trailing blanks in key */ - lead_blanks = 0; - for (i=0; i=0; i--) if (key[i] != ' ') break; - if (i < 0) { - FPRINTF(stderr, "MPI_Info_delete: key is a blank string\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - new_keylen = i + 1 - lead_blanks; - key += lead_blanks; - - newkey = (char *) ADIOI_Malloc((new_keylen+1)*sizeof(char)); - ADIOI_Strncpy(newkey, key, new_keylen); - newkey[new_keylen] = '\0'; - - info_c = MPI_Info_f2c(*info); - *ierr = MPI_Info_delete(info_c, newkey); - ADIOI_Free(newkey); -} - diff --git a/ompi/mca/io/romio/romio/mpi2-other/info/fortran/info_dupf.c b/ompi/mca/io/romio/romio/mpi2-other/info/fortran/info_dupf.c deleted file mode 100644 index 6d4fd40331..0000000000 --- a/ompi/mca/io/romio/romio/mpi2-other/info/fortran/info_dupf.c +++ /dev/null @@ -1,94 +0,0 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ -/* - * - * Copyright (C) 1997 University of Chicago. - * See COPYRIGHT notice in top-level directory. - */ - -#include "mpio.h" -#include "adio.h" - - -#if defined(MPIO_BUILD_PROFILING) || defined(HAVE_WEAK_SYMBOLS) -#ifdef FORTRANCAPS -#define mpi_info_dup_ PMPI_INFO_DUP -#elif defined(FORTRANDOUBLEUNDERSCORE) -#define mpi_info_dup_ pmpi_info_dup__ -#elif !defined(FORTRANUNDERSCORE) -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF pmpi_info_dup pmpi_info_dup_ -#endif -#define mpi_info_dup_ pmpi_info_dup -#else -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF pmpi_info_dup_ pmpi_info_dup -#endif -#define mpi_info_dup_ pmpi_info_dup_ -#endif - -#if defined(HAVE_WEAK_SYMBOLS) -#if defined(HAVE_PRAGMA_WEAK) -#if defined(FORTRANCAPS) -#pragma weak MPI_INFO_DUP = PMPI_INFO_DUP -#elif defined(FORTRANDOUBLEUNDERSCORE) -#pragma weak mpi_info_dup__ = pmpi_info_dup__ -#elif !defined(FORTRANUNDERSCORE) -#pragma weak mpi_info_dup = pmpi_info_dup -#else -#pragma weak mpi_info_dup_ = pmpi_info_dup_ -#endif - -#elif defined(HAVE_PRAGMA_HP_SEC_DEF) -#if defined(FORTRANCAPS) -#pragma _HP_SECONDARY_DEF PMPI_INFO_DUP MPI_INFO_DUP -#elif defined(FORTRANDOUBLEUNDERSCORE) -#pragma _HP_SECONDARY_DEF pmpi_info_dup__ mpi_info_dup__ -#elif !defined(FORTRANUNDERSCORE) -#pragma _HP_SECONDARY_DEF pmpi_info_dup mpi_info_dup -#else -#pragma _HP_SECONDARY_DEF pmpi_info_dup_ mpi_info_dup_ -#endif - -#elif defined(HAVE_PRAGMA_CRI_DUP) -#if defined(FORTRANCAPS) -#pragma _CRI duplicate MPI_INFO_DUP as PMPI_INFO_DUP -#elif defined(FORTRANDOUBLEUNDERSCORE) -#pragma _CRI duplicate mpi_info_dup__ as pmpi_info_dup__ -#elif !defined(FORTRANUNDERSCORE) -#pragma _CRI duplicate mpi_info_dup as pmpi_info_dup -#else -#pragma _CRI duplicate mpi_info_dup_ as pmpi_info_dup_ -#endif - -/* end of weak pragmas */ -#endif -/* Include mapping from MPI->PMPI */ -#include "mpioprof.h" -#endif - -#else - -#ifdef FORTRANCAPS -#define mpi_info_dup_ MPI_INFO_DUP -#elif defined(FORTRANDOUBLEUNDERSCORE) -#define mpi_info_dup_ mpi_info_dup__ -#elif !defined(FORTRANUNDERSCORE) -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF mpi_info_dup mpi_info_dup_ -#endif -#define mpi_info_dup_ mpi_info_dup -#else -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF mpi_info_dup_ mpi_info_dup -#endif -#endif -#endif - -void mpi_info_dup_(MPI_Fint *info, MPI_Fint *newinfo, int *ierr ) -{ - MPI_Info info_c, newinfo_c; - - info_c = MPI_Info_f2c(*info); - *ierr = MPI_Info_dup(info_c, &newinfo_c); - *newinfo = MPI_Info_c2f(newinfo_c); -} diff --git a/ompi/mca/io/romio/romio/mpi2-other/info/fortran/info_freef.c b/ompi/mca/io/romio/romio/mpi2-other/info/fortran/info_freef.c deleted file mode 100644 index d8f0f88d3a..0000000000 --- a/ompi/mca/io/romio/romio/mpi2-other/info/fortran/info_freef.c +++ /dev/null @@ -1,95 +0,0 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ -/* - * - * Copyright (C) 1997 University of Chicago. - * See COPYRIGHT notice in top-level directory. - */ - -#include "mpio.h" -#include "adio.h" - - -#if defined(MPIO_BUILD_PROFILING) || defined(HAVE_WEAK_SYMBOLS) -#ifdef FORTRANCAPS -#define mpi_info_free_ PMPI_INFO_FREE -#elif defined(FORTRANDOUBLEUNDERSCORE) -#define mpi_info_free_ pmpi_info_free__ -#elif !defined(FORTRANUNDERSCORE) -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF pmpi_info_free pmpi_info_free_ -#endif -#define mpi_info_free_ pmpi_info_free -#else -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF pmpi_info_free_ pmpi_info_free -#endif -#define mpi_info_free_ pmpi_info_free_ -#endif - -#if defined(HAVE_WEAK_SYMBOLS) -#if defined(HAVE_PRAGMA_WEAK) -#if defined(FORTRANCAPS) -#pragma weak MPI_INFO_FREE = PMPI_INFO_FREE -#elif defined(FORTRANDOUBLEUNDERSCORE) -#pragma weak mpi_info_free__ = pmpi_info_free__ -#elif !defined(FORTRANUNDERSCORE) -#pragma weak mpi_info_free = pmpi_info_free -#else -#pragma weak mpi_info_free_ = pmpi_info_free_ -#endif - -#elif defined(HAVE_PRAGMA_HP_SEC_DEF) -#if defined(FORTRANCAPS) -#pragma _HP_SECONDARY_DEF PMPI_INFO_FREE MPI_INFO_FREE -#elif defined(FORTRANDOUBLEUNDERSCORE) -#pragma _HP_SECONDARY_DEF pmpi_info_free__ mpi_info_free__ -#elif !defined(FORTRANUNDERSCORE) -#pragma _HP_SECONDARY_DEF pmpi_info_free mpi_info_free -#else -#pragma _HP_SECONDARY_DEF pmpi_info_free_ mpi_info_free_ -#endif - -#elif defined(HAVE_PRAGMA_CRI_DUP) -#if defined(FORTRANCAPS) -#pragma _CRI duplicate MPI_INFO_FREE as PMPI_INFO_FREE -#elif defined(FORTRANDOUBLEUNDERSCORE) -#pragma _CRI duplicate mpi_info_free__ as pmpi_info_free__ -#elif !defined(FORTRANUNDERSCORE) -#pragma _CRI duplicate mpi_info_free as pmpi_info_free -#else -#pragma _CRI duplicate mpi_info_free_ as pmpi_info_free_ -#endif - -/* end of weak pragmas */ -#endif -/* Include mapping from MPI->PMPI */ -#include "mpioprof.h" -#endif - -#else - -#ifdef FORTRANCAPS -#define mpi_info_free_ MPI_INFO_FREE -#elif defined(FORTRANDOUBLEUNDERSCORE) -#define mpi_info_free_ mpi_info_free__ -#elif !defined(FORTRANUNDERSCORE) -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF mpi_info_free mpi_info_free_ -#endif -#define mpi_info_free_ mpi_info_free -#else -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF mpi_info_free_ mpi_info_free -#endif -#endif -#endif - -void mpi_info_free_(MPI_Fint *info, int *ierr ) -{ - MPI_Info info_c; - - info_c = MPI_Info_f2c(*info); - *ierr = MPI_Info_free(&info_c); - *info = MPI_Info_c2f(info_c); -} - diff --git a/ompi/mca/io/romio/romio/mpi2-other/info/fortran/info_getf.c b/ompi/mca/io/romio/romio/mpi2-other/info/fortran/info_getf.c deleted file mode 100644 index 0fc8e13614..0000000000 --- a/ompi/mca/io/romio/romio/mpi2-other/info/fortran/info_getf.c +++ /dev/null @@ -1,144 +0,0 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ -/* - * - * Copyright (C) 1997 University of Chicago. - * See COPYRIGHT notice in top-level directory. - */ - -#include "mpio.h" -#include "adio.h" - - -#if defined(MPIO_BUILD_PROFILING) || defined(HAVE_WEAK_SYMBOLS) -#ifdef FORTRANCAPS -#define mpi_info_get_ PMPI_INFO_GET -#elif defined(FORTRANDOUBLEUNDERSCORE) -#define mpi_info_get_ pmpi_info_get__ -#elif !defined(FORTRANUNDERSCORE) -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF pmpi_info_get pmpi_info_get_ -#endif -#define mpi_info_get_ pmpi_info_get -#else -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF pmpi_info_get_ pmpi_info_get -#endif -#define mpi_info_get_ pmpi_info_get_ -#endif - -#if defined(HAVE_WEAK_SYMBOLS) -#if defined(HAVE_PRAGMA_WEAK) -#if defined(FORTRANCAPS) -#pragma weak MPI_INFO_GET = PMPI_INFO_GET -#elif defined(FORTRANDOUBLEUNDERSCORE) -#pragma weak mpi_info_get__ = pmpi_info_get__ -#elif !defined(FORTRANUNDERSCORE) -#pragma weak mpi_info_get = pmpi_info_get -#else -#pragma weak mpi_info_get_ = pmpi_info_get_ -#endif - -#elif defined(HAVE_PRAGMA_HP_SEC_DEF) -#if defined(FORTRANCAPS) -#pragma _HP_SECONDARY_DEF PMPI_INFO_GET MPI_INFO_GET -#elif defined(FORTRANDOUBLEUNDERSCORE) -#pragma _HP_SECONDARY_DEF pmpi_info_get__ mpi_info_get__ -#elif !defined(FORTRANUNDERSCORE) -#pragma _HP_SECONDARY_DEF pmpi_info_get mpi_info_get -#else -#pragma _HP_SECONDARY_DEF pmpi_info_get_ mpi_info_get_ -#endif - -#elif defined(HAVE_PRAGMA_CRI_DUP) -#if defined(FORTRANCAPS) -#pragma _CRI duplicate MPI_INFO_GET as PMPI_INFO_GET -#elif defined(FORTRANDOUBLEUNDERSCORE) -#pragma _CRI duplicate mpi_info_get__ as pmpi_info_get__ -#elif !defined(FORTRANUNDERSCORE) -#pragma _CRI duplicate mpi_info_get as pmpi_info_get -#else -#pragma _CRI duplicate mpi_info_get_ as pmpi_info_get_ -#endif - -/* end of weak pragmas */ -#endif -/* Include mapping from MPI->PMPI */ -#include "mpioprof.h" -#endif - -#else - -#ifdef FORTRANCAPS -#define mpi_info_get_ MPI_INFO_GET -#elif defined(FORTRANDOUBLEUNDERSCORE) -#define mpi_info_get_ mpi_info_get__ -#elif !defined(FORTRANUNDERSCORE) -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF mpi_info_get mpi_info_get_ -#endif -#define mpi_info_get_ mpi_info_get -#else -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF mpi_info_get_ mpi_info_get -#endif -#endif -#endif - -void mpi_info_get_(MPI_Fint *info, char *key, int *valuelen, char *value, - int *flag, int *ierr, int keylen, int valspace) -{ - MPI_Info info_c; - char *newkey, *tmpvalue; - int new_keylen, lead_blanks, i, tmpvaluelen; - - if (key <= (char *) 0) { - FPRINTF(stderr, "MPI_Info_get: key is an invalid address\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - /* strip leading and trailing blanks in key */ - lead_blanks = 0; - for (i=0; i=0; i--) if (key[i] != ' ') break; - if (i < 0) { - FPRINTF(stderr, "MPI_Info_get: key is a blank string\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - new_keylen = i + 1 - lead_blanks; - key += lead_blanks; - - newkey = (char *) ADIOI_Malloc((new_keylen+1)*sizeof(char)); - ADIOI_Strncpy(newkey, key, new_keylen); - newkey[new_keylen] = '\0'; - - if (value <= (char *) 0) { - FPRINTF(stderr, "MPI_Info_get: value is an invalid address\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - if (*valuelen <= 0) { - FPRINTF(stderr, "MPI_Info_get: Invalid valuelen argument\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - if (*valuelen > valspace) { - FPRINTF(stderr, "MPI_Info_get: valuelen is greater than the amount of memory available in value\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - tmpvalue = (char *) ADIOI_Malloc((*valuelen + 1)*sizeof(char)); - - info_c = MPI_Info_f2c(*info); - *ierr = MPI_Info_get(info_c, newkey, *valuelen, tmpvalue, flag); - - if (*flag) { - tmpvaluelen = strlen(tmpvalue); - ADIOI_Strncpy(value, tmpvalue, tmpvaluelen); - /* blank pad the remaining space */ - for (i=tmpvaluelen; iPMPI */ -#include "mpioprof.h" -#endif - -#else - -#ifdef FORTRANCAPS -#define mpi_info_get_nkeys_ MPI_INFO_GET_NKEYS -#elif defined(FORTRANDOUBLEUNDERSCORE) -#define mpi_info_get_nkeys_ mpi_info_get_nkeys__ -#elif !defined(FORTRANUNDERSCORE) -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF mpi_info_get_nkeys mpi_info_get_nkeys_ -#endif -#define mpi_info_get_nkeys_ mpi_info_get_nkeys -#else -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF mpi_info_get_nkeys_ mpi_info_get_nkeys -#endif -#endif -#endif - -void mpi_info_get_nkeys_(MPI_Fint *info, int *nkeys, int *ierr ) -{ - MPI_Info info_c; - - info_c = MPI_Info_f2c(*info); - *ierr = MPI_Info_get_nkeys(info_c, nkeys); -} diff --git a/ompi/mca/io/romio/romio/mpi2-other/info/fortran/info_getnthf.c b/ompi/mca/io/romio/romio/mpi2-other/info/fortran/info_getnthf.c deleted file mode 100644 index 21c3fe99f0..0000000000 --- a/ompi/mca/io/romio/romio/mpi2-other/info/fortran/info_getnthf.c +++ /dev/null @@ -1,120 +0,0 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ -/* - * - * Copyright (C) 1997 University of Chicago. - * See COPYRIGHT notice in top-level directory. - */ - -#include "mpio.h" -#include "adio.h" - - -#if defined(MPIO_BUILD_PROFILING) || defined(HAVE_WEAK_SYMBOLS) -#ifdef FORTRANCAPS -#define mpi_info_get_nthkey_ PMPI_INFO_GET_NTHKEY -#elif defined(FORTRANDOUBLEUNDERSCORE) -#define mpi_info_get_nthkey_ pmpi_info_get_nthkey__ -#elif !defined(FORTRANUNDERSCORE) -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF pmpi_info_get_nthkey pmpi_info_get_nthkey_ -#endif -#define mpi_info_get_nthkey_ pmpi_info_get_nthkey -#else -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF pmpi_info_get_nthkey_ pmpi_info_get_nthkey -#endif -#define mpi_info_get_nthkey_ pmpi_info_get_nthkey_ -#endif - -#if defined(HAVE_WEAK_SYMBOLS) -#if defined(HAVE_PRAGMA_WEAK) -#if defined(FORTRANCAPS) -#pragma weak MPI_INFO_GET_NTHKEY = PMPI_INFO_GET_NTHKEY -#elif defined(FORTRANDOUBLEUNDERSCORE) -#pragma weak mpi_info_get_nthkey__ = pmpi_info_get_nthkey__ -#elif !defined(FORTRANUNDERSCORE) -#pragma weak mpi_info_get_nthkey = pmpi_info_get_nthkey -#else -#pragma weak mpi_info_get_nthkey_ = pmpi_info_get_nthkey_ -#endif - -#elif defined(HAVE_PRAGMA_HP_SEC_DEF) -#if defined(FORTRANCAPS) -#pragma _HP_SECONDARY_DEF PMPI_INFO_GET_NTHKEY MPI_INFO_GET_NTHKEY -#elif defined(FORTRANDOUBLEUNDERSCORE) -#pragma _HP_SECONDARY_DEF pmpi_info_get_nthkey__ mpi_info_get_nthkey__ -#elif !defined(FORTRANUNDERSCORE) -#pragma _HP_SECONDARY_DEF pmpi_info_get_nthkey mpi_info_get_nthkey -#else -#pragma _HP_SECONDARY_DEF pmpi_info_get_nthkey_ mpi_info_get_nthkey_ -#endif - -#elif defined(HAVE_PRAGMA_CRI_DUP) -#if defined(FORTRANCAPS) -#pragma _CRI duplicate MPI_INFO_GET_NTHKEY as PMPI_INFO_GET_NTHKEY -#elif defined(FORTRANDOUBLEUNDERSCORE) -#pragma _CRI duplicate mpi_info_get_nthkey__ as pmpi_info_get_nthkey__ -#elif !defined(FORTRANUNDERSCORE) -#pragma _CRI duplicate mpi_info_get_nthkey as pmpi_info_get_nthkey -#else -#pragma _CRI duplicate mpi_info_get_nthkey_ as pmpi_info_get_nthkey_ -#endif - -/* end of weak pragmas */ -#endif -/* Include mapping from MPI->PMPI */ -#include "mpioprof.h" -#endif - -#else - -#ifdef FORTRANCAPS -#define mpi_info_get_nthkey_ MPI_INFO_GET_NTHKEY -#elif defined(FORTRANDOUBLEUNDERSCORE) -#define mpi_info_get_nthkey_ mpi_info_get_nthkey__ -#elif !defined(FORTRANUNDERSCORE) -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF mpi_info_get_nthkey mpi_info_get_nthkey_ -#endif -#define mpi_info_get_nthkey_ mpi_info_get_nthkey -#else -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF mpi_info_get_nthkey_ mpi_info_get_nthkey -#endif -#endif -#endif - -void mpi_info_get_nthkey_(MPI_Fint *info, int *n, char *key, int *ierr, - int keylen) -{ - MPI_Info info_c; - int i, tmpkeylen; - char *tmpkey; - - if (key <= (char *) 0) { - FPRINTF(stderr, "MPI_Info_get_nthkey: key is an invalid address\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - tmpkey = (char *) ADIOI_Malloc((MPI_MAX_INFO_KEY+1) * sizeof(char)); - info_c = MPI_Info_f2c(*info); - *ierr = MPI_Info_get_nthkey(info_c, *n, tmpkey); - - tmpkeylen = strlen(tmpkey); - - if (tmpkeylen <= keylen) { - ADIOI_Strncpy(key, tmpkey, tmpkeylen); - - /* blank pad the remaining space */ - for (i=tmpkeylen; iPMPI */ -#include "mpioprof.h" -#endif - -#else - -#ifdef FORTRANCAPS -#define mpi_info_get_valuelen_ MPI_INFO_GET_VALUELEN -#elif defined(FORTRANDOUBLEUNDERSCORE) -#define mpi_info_get_valuelen_ mpi_info_get_valuelen__ -#elif !defined(FORTRANUNDERSCORE) -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF mpi_info_get_valuelen mpi_info_get_valuelen_ -#endif -#define mpi_info_get_valuelen_ mpi_info_get_valuelen -#else -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF mpi_info_get_valuelen_ mpi_info_get_valuelen -#endif -#endif -#endif - -void mpi_info_get_valuelen_(MPI_Fint *info, char *key, int *valuelen, - int *flag, int *ierr, int keylen ) -{ - MPI_Info info_c; - char *newkey; - int new_keylen, lead_blanks, i; - - if (key <= (char *) 0) { - FPRINTF(stderr, "MPI_Info_get_valuelen: key is an invalid address\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - /* strip leading and trailing blanks in key */ - lead_blanks = 0; - for (i=0; i=0; i--) if (key[i] != ' ') break; - if (i < 0) { - FPRINTF(stderr, "MPI_Info_get_valuelen: key is a blank string\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - new_keylen = i + 1 - lead_blanks; - key += lead_blanks; - - newkey = (char *) ADIOI_Malloc((new_keylen+1)*sizeof(char)); - ADIOI_Strncpy(newkey, key, new_keylen); - newkey[new_keylen] = '\0'; - - info_c = MPI_Info_f2c(*info); - *ierr = MPI_Info_get_valuelen(info_c, newkey, valuelen, flag); - ADIOI_Free(newkey); -} diff --git a/ompi/mca/io/romio/romio/mpi2-other/info/fortran/info_setf.c b/ompi/mca/io/romio/romio/mpi2-other/info/fortran/info_setf.c deleted file mode 100644 index 5381c41a3c..0000000000 --- a/ompi/mca/io/romio/romio/mpi2-other/info/fortran/info_setf.c +++ /dev/null @@ -1,146 +0,0 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ -/* - * - * Copyright (C) 1997 University of Chicago. - * See COPYRIGHT notice in top-level directory. - */ - -#include "mpio.h" -#include "adio.h" - - -#if defined(MPIO_BUILD_PROFILING) || defined(HAVE_WEAK_SYMBOLS) -#ifdef FORTRANCAPS -#define mpi_info_set_ PMPI_INFO_SET -#elif defined(FORTRANDOUBLEUNDERSCORE) -#define mpi_info_set_ pmpi_info_set__ -#elif !defined(FORTRANUNDERSCORE) -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF pmpi_info_set pmpi_info_set_ -#endif -#define mpi_info_set_ pmpi_info_set -#else -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF pmpi_info_set_ pmpi_info_set -#endif -#define mpi_info_set_ pmpi_info_set_ -#endif - -#if defined(HAVE_WEAK_SYMBOLS) -#if defined(HAVE_PRAGMA_WEAK) -#if defined(FORTRANCAPS) -#pragma weak MPI_INFO_SET = PMPI_INFO_SET -#elif defined(FORTRANDOUBLEUNDERSCORE) -#pragma weak mpi_info_set__ = pmpi_info_set__ -#elif !defined(FORTRANUNDERSCORE) -#pragma weak mpi_info_set = pmpi_info_set -#else -#pragma weak mpi_info_set_ = pmpi_info_set_ -#endif - -#elif defined(HAVE_PRAGMA_HP_SEC_DEF) -#if defined(FORTRANCAPS) -#pragma _HP_SECONDARY_DEF PMPI_INFO_SET MPI_INFO_SET -#elif defined(FORTRANDOUBLEUNDERSCORE) -#pragma _HP_SECONDARY_DEF pmpi_info_set__ mpi_info_set__ -#elif !defined(FORTRANUNDERSCORE) -#pragma _HP_SECONDARY_DEF pmpi_info_set mpi_info_set -#else -#pragma _HP_SECONDARY_DEF pmpi_info_set_ mpi_info_set_ -#endif - -#elif defined(HAVE_PRAGMA_CRI_DUP) -#if defined(FORTRANCAPS) -#pragma _CRI duplicate MPI_INFO_SET as PMPI_INFO_SET -#elif defined(FORTRANDOUBLEUNDERSCORE) -#pragma _CRI duplicate mpi_info_set__ as pmpi_info_set__ -#elif !defined(FORTRANUNDERSCORE) -#pragma _CRI duplicate mpi_info_set as pmpi_info_set -#else -#pragma _CRI duplicate mpi_info_set_ as pmpi_info_set_ -#endif - -/* end of weak pragmas */ -#endif -/* Include mapping from MPI->PMPI */ -#include "mpioprof.h" -#endif - -#else - -#ifdef FORTRANCAPS -#define mpi_info_set_ MPI_INFO_SET -#elif defined(FORTRANDOUBLEUNDERSCORE) -#define mpi_info_set_ mpi_info_set__ -#elif !defined(FORTRANUNDERSCORE) -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF mpi_info_set mpi_info_set_ -#endif -#define mpi_info_set_ mpi_info_set -#else -#if defined(HPUX) || defined(SPPUX) -#pragma _HP_SECONDARY_DEF mpi_info_set_ mpi_info_set -#endif -#endif -#endif - - -void mpi_info_set_(MPI_Fint *info, char *key, char *value, int *ierr, - int keylen, int vallen) -{ - MPI_Info info_c; - char *newkey, *newvalue; - int new_keylen, new_vallen, lead_blanks, i; - - if (key <= (char *) 0) { - FPRINTF(stderr, "MPI_Info_set: key is an invalid address\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - if (value <= (char *) 0) { - FPRINTF(stderr, "MPI_Info_set: value is an invalid address\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - /* strip leading and trailing blanks in key */ - lead_blanks = 0; - for (i=0; i=0; i--) if (key[i] != ' ') break; - if (i < 0) { - FPRINTF(stderr, "MPI_Info_set: key is a blank string\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - new_keylen = i + 1 - lead_blanks; - key += lead_blanks; - - newkey = (char *) ADIOI_Malloc((new_keylen+1)*sizeof(char)); - ADIOI_Strncpy(newkey, key, new_keylen); - newkey[new_keylen] = '\0'; - - - /* strip leading and trailing blanks in value */ - lead_blanks = 0; - for (i=0; i=0; i--) if (value[i] != ' ') break; - if (i < 0) { - FPRINTF(stderr, "MPI_Info_set: value is a blank string\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - new_vallen = i + 1 - lead_blanks; - value += lead_blanks; - - newvalue = (char *) ADIOI_Malloc((new_vallen+1)*sizeof(char)); - ADIOI_Strncpy(newvalue, value, new_vallen); - newvalue[new_vallen] = '\0'; - - - info_c = MPI_Info_f2c(*info); - *ierr = MPI_Info_set(info_c, newkey, newvalue); - ADIOI_Free(newkey); - ADIOI_Free(newvalue); -} diff --git a/ompi/mca/io/romio/romio/mpi2-other/info/info_c2f.c b/ompi/mca/io/romio/romio/mpi2-other/info/info_c2f.c deleted file mode 100644 index b82bf89526..0000000000 --- a/ompi/mca/io/romio/romio/mpi2-other/info/info_c2f.c +++ /dev/null @@ -1,64 +0,0 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ -/* - * - * Copyright (C) 1997 University of Chicago. - * See COPYRIGHT notice in top-level directory. - */ - -#include "mpioimpl.h" - -#ifdef HAVE_WEAK_SYMBOLS - -#if defined(HAVE_PRAGMA_WEAK) -#pragma weak MPI_Info_c2f = PMPI_Info_c2f -#elif defined(HAVE_PRAGMA_HP_SEC_DEF) -#pragma _HP_SECONDARY_DEF PMPI_Info_c2f MPI_Info_c2f -#elif defined(HAVE_PRAGMA_CRI_DUP) -#pragma _CRI duplicate MPI_Info_c2f as PMPI_Info_c2f -/* end of weak pragmas */ -#endif - -/* Include mapping from MPI->PMPI */ -#define MPIO_BUILD_PROFILING -#include "mpioprof.h" -#endif -#include "adio_extern.h" - -/*@ - MPI_Info_c2f - Translates a C info handle to a Fortran info handle - -Input Parameters: -. info - C info handle (integer) - -Return Value: - Fortran info handle (handle) -@*/ -MPI_Fint MPI_Info_c2f(MPI_Info info) -{ -#ifndef INT_LT_POINTER - return (MPI_Fint) info; -#else - int i; - - if ((info <= (MPI_Info) 0) || (info->cookie != MPIR_INFO_COOKIE)) - return (MPI_Fint) 0; - if (!MPIR_Infotable) { - MPIR_Infotable_max = 1024; - MPIR_Infotable = (MPI_Info *) - ADIOI_Malloc(MPIR_Infotable_max*sizeof(MPI_Info)); - MPIR_Infotable_ptr = 0; /* 0 can't be used though, because - MPI_INFO_NULL=0 */ - for (i=0; iPMPI */ -#define MPIO_BUILD_PROFILING -#include "mpioprof.h" -#endif - -/*@ - MPI_Info_create - Creates a new info object - -Output Parameters: -. info - info object (handle) - -.N fortran -@*/ -int MPI_Info_create(MPI_Info *info) -{ - int error_code; - - MPIR_MPIOInit(&error_code); - if (error_code != MPI_SUCCESS) goto fn_exit; - - *info = (MPI_Info) ADIOI_Malloc(sizeof(struct MPIR_Info)); - (*info)->cookie = MPIR_INFO_COOKIE; - (*info)->key = 0; - (*info)->value = 0; - (*info)->next = 0; - /* this is the first structure in this linked list. it is - always kept empty. new (key,value) pairs are added after it. */ - -fn_exit: - return MPI_SUCCESS; -} diff --git a/ompi/mca/io/romio/romio/mpi2-other/info/info_delete.c b/ompi/mca/io/romio/romio/mpi2-other/info/info_delete.c deleted file mode 100644 index ab72499d4f..0000000000 --- a/ompi/mca/io/romio/romio/mpi2-other/info/info_delete.c +++ /dev/null @@ -1,83 +0,0 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ -/* - * - * Copyright (C) 1997 University of Chicago. - * See COPYRIGHT notice in top-level directory. - */ - -#include "mpioimpl.h" - -#ifdef HAVE_WEAK_SYMBOLS - -#if defined(HAVE_PRAGMA_WEAK) -#pragma weak MPI_Info_delete = PMPI_Info_delete -#elif defined(HAVE_PRAGMA_HP_SEC_DEF) -#pragma _HP_SECONDARY_DEF PMPI_Info_delete MPI_Info_delete -#elif defined(HAVE_PRAGMA_CRI_DUP) -#pragma _CRI duplicate MPI_Info_delete as PMPI_Info_delete -/* end of weak pragmas */ -#endif - -/* Include mapping from MPI->PMPI */ -#define MPIO_BUILD_PROFILING -#include "mpioprof.h" -#endif - -/*@ - MPI_Info_delete - Deletes a (key,value) pair from info - -Input Parameters: -. info - info object (handle) -. key - key (string) - -.N fortran -@*/ -int MPI_Info_delete(MPI_Info info, char *key) -{ - MPI_Info prev, curr; - int done; - - if ((info <= (MPI_Info) 0) || (info->cookie != MPIR_INFO_COOKIE)) { - FPRINTF(stderr, "MPI_Info_delete: Invalid info object\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - if (key <= (char *) 0) { - FPRINTF(stderr, "MPI_Info_delete: key is an invalid address\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - if (strlen(key) > MPI_MAX_INFO_KEY) { - FPRINTF(stderr, "MPI_Info_delete: key is longer than MPI_MAX_INFO_KEY\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - if (!strlen(key)) { - FPRINTF(stderr, "MPI_Info_delete: key is a null string\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - prev = info; - curr = info->next; - done = 0; - - while (curr) { - if (!strcmp(curr->key, key)) { - ADIOI_Free(curr->key); - ADIOI_Free(curr->value); - prev->next = curr->next; - ADIOI_Free(curr); - done = 1; - break; - } - prev = curr; - curr = curr->next; - } - - if (!done) { - FPRINTF(stderr, "MPI_Info_delete: key not defined in info\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - return MPI_SUCCESS; -} diff --git a/ompi/mca/io/romio/romio/mpi2-other/info/info_dup.c b/ompi/mca/io/romio/romio/mpi2-other/info/info_dup.c deleted file mode 100644 index aea92855ec..0000000000 --- a/ompi/mca/io/romio/romio/mpi2-other/info/info_dup.c +++ /dev/null @@ -1,66 +0,0 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ -/* - * - * Copyright (C) 1997 University of Chicago. - * See COPYRIGHT notice in top-level directory. - */ - -#include "mpioimpl.h" - -#ifdef HAVE_WEAK_SYMBOLS - -#if defined(HAVE_PRAGMA_WEAK) -#pragma weak MPI_Info_dup = PMPI_Info_dup -#elif defined(HAVE_PRAGMA_HP_SEC_DEF) -#pragma _HP_SECONDARY_DEF PMPI_Info_dup MPI_Info_dup -#elif defined(HAVE_PRAGMA_CRI_DUP) -#pragma _CRI duplicate MPI_Info_dup as PMPI_Info_dup -/* end of weak pragmas */ -#endif - -/* Include mapping from MPI->PMPI */ -#define MPIO_BUILD_PROFILING -#include "mpioprof.h" -#endif - -/*@ - MPI_Info_dup - Returns a duplicate of the info object - -Input Parameters: -. info - info object (handle) - -Output Parameters: -. newinfo - duplicate of info object (handle) - -.N fortran -@*/ -int MPI_Info_dup(MPI_Info info, MPI_Info *newinfo) -{ - MPI_Info curr_old, curr_new; - - if ((info <= (MPI_Info) 0) || (info->cookie != MPIR_INFO_COOKIE)) { - FPRINTF(stderr, "MPI_Info_dup: Invalid info object\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - *newinfo = (MPI_Info) ADIOI_Malloc(sizeof(struct MPIR_Info)); - curr_new = *newinfo; - curr_new->cookie = MPIR_INFO_COOKIE; - curr_new->key = 0; - curr_new->value = 0; - curr_new->next = 0; - - curr_old = info->next; - while (curr_old) { - curr_new->next = (MPI_Info) ADIOI_Malloc(sizeof(struct MPIR_Info)); - curr_new = curr_new->next; - curr_new->cookie = 0; /* cookie not set on purpose */ - curr_new->key = ADIOI_Strdup(curr_old->key); - curr_new->value = ADIOI_Strdup(curr_old->value); - curr_new->next = 0; - - curr_old = curr_old->next; - } - - return MPI_SUCCESS; -} diff --git a/ompi/mca/io/romio/romio/mpi2-other/info/info_f2c.c b/ompi/mca/io/romio/romio/mpi2-other/info/info_f2c.c deleted file mode 100644 index 2cef4f5faf..0000000000 --- a/ompi/mca/io/romio/romio/mpi2-other/info/info_f2c.c +++ /dev/null @@ -1,49 +0,0 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ -/* - * - * Copyright (C) 1997 University of Chicago. - * See COPYRIGHT notice in top-level directory. - */ - -#include "mpioimpl.h" - -#ifdef HAVE_WEAK_SYMBOLS - -#if defined(HAVE_PRAGMA_WEAK) -#pragma weak MPI_Info_f2c = PMPI_Info_f2c -#elif defined(HAVE_PRAGMA_HP_SEC_DEF) -#pragma _HP_SECONDARY_DEF PMPI_Info_f2c MPI_Info_f2c -#elif defined(HAVE_PRAGMA_CRI_DUP) -#pragma _CRI duplicate MPI_Info_f2c as PMPI_Info_f2c -/* end of weak pragmas */ -#endif - -/* Include mapping from MPI->PMPI */ -#define MPIO_BUILD_PROFILING -#include "mpioprof.h" -#endif -#include "adio_extern.h" - -/*@ - MPI_Info_f2c - Translates a Fortran info handle to a C info handle - -Input Parameters: -. info - Fortran info handle (integer) - -Return Value: - C info handle (handle) -@*/ -MPI_Info MPI_Info_f2c(MPI_Fint info) -{ - -#ifndef INT_LT_POINTER - return (MPI_Info) info; -#else - if (!info) return MPI_INFO_NULL; - if ((info < 0) || (info > MPIR_Infotable_ptr)) { - FPRINTF(stderr, "MPI_Info_f2c: Invalid info handle\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - return MPIR_Infotable[info]; -#endif -} diff --git a/ompi/mca/io/romio/romio/mpi2-other/info/info_free.c b/ompi/mca/io/romio/romio/mpi2-other/info/info_free.c deleted file mode 100644 index b14699809c..0000000000 --- a/ompi/mca/io/romio/romio/mpi2-other/info/info_free.c +++ /dev/null @@ -1,56 +0,0 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ -/* - * - * Copyright (C) 1997 University of Chicago. - * See COPYRIGHT notice in top-level directory. - */ - -#include "mpioimpl.h" - -#ifdef HAVE_WEAK_SYMBOLS - -#if defined(HAVE_PRAGMA_WEAK) -#pragma weak MPI_Info_free = PMPI_Info_free -#elif defined(HAVE_PRAGMA_HP_SEC_DEF) -#pragma _HP_SECONDARY_DEF PMPI_Info_free MPI_Info_free -#elif defined(HAVE_PRAGMA_CRI_DUP) -#pragma _CRI duplicate MPI_Info_free as PMPI_Info_free -/* end of weak pragmas */ -#endif - -/* Include mapping from MPI->PMPI */ -#define MPIO_BUILD_PROFILING -#include "mpioprof.h" -#endif - -/*@ - MPI_Info_free - Frees an info object - -Input Parameters: -. info - info object (handle) - -.N fortran -@*/ -int MPI_Info_free(MPI_Info *info) -{ - MPI_Info curr, next; - - if ((*info <= (MPI_Info) 0) || ((*info)->cookie != MPIR_INFO_COOKIE)) { - FPRINTF(stderr, "MPI_Info_free: Invalid info object\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - curr = (*info)->next; - ADIOI_Free(*info); - *info = MPI_INFO_NULL; - - while (curr) { - next = curr->next; - ADIOI_Free(curr->key); - ADIOI_Free(curr->value); - ADIOI_Free(curr); - curr = next; - } - - return MPI_SUCCESS; -} diff --git a/ompi/mca/io/romio/romio/mpi2-other/info/info_get.c b/ompi/mca/io/romio/romio/mpi2-other/info/info_get.c deleted file mode 100644 index 443b4fc51d..0000000000 --- a/ompi/mca/io/romio/romio/mpi2-other/info/info_get.c +++ /dev/null @@ -1,88 +0,0 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ -/* - * - * Copyright (C) 1997 University of Chicago. - * See COPYRIGHT notice in top-level directory. - */ - -#include "mpioimpl.h" - -#ifdef HAVE_WEAK_SYMBOLS - -#if defined(HAVE_PRAGMA_WEAK) -#pragma weak MPI_Info_get = PMPI_Info_get -#elif defined(HAVE_PRAGMA_HP_SEC_DEF) -#pragma _HP_SECONDARY_DEF PMPI_Info_get MPI_Info_get -#elif defined(HAVE_PRAGMA_CRI_DUP) -#pragma _CRI duplicate MPI_Info_get as PMPI_Info_get -/* end of weak pragmas */ -#endif - -/* Include mapping from MPI->PMPI */ -#define MPIO_BUILD_PROFILING -#include "mpioprof.h" -#endif - -/*@ - MPI_Info_get - Retrieves the value associated with a key - -Input Parameters: -. info - info object (handle) -. key - key (string) -. valuelen - length of value argument (integer) - -Output Parameters: -. value - value (string) -. flag - true if key defined, false if not (boolean) - -.N fortran -@*/ -int MPI_Info_get(MPI_Info info, char *key, int valuelen, char *value, int *flag) -{ - MPI_Info curr; - - if ((info <= (MPI_Info) 0) || (info->cookie != MPIR_INFO_COOKIE)) { - FPRINTF(stderr, "MPI_Info_get: Invalid info object\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - if (key <= (char *) 0) { - FPRINTF(stderr, "MPI_Info_get: key is an invalid address\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - if (strlen(key) > MPI_MAX_INFO_KEY) { - FPRINTF(stderr, "MPI_Info_get: key is longer than MPI_MAX_INFO_KEY\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - if (!strlen(key)) { - FPRINTF(stderr, "MPI_Info_get: key is a null string\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - if (valuelen <= 0) { - FPRINTF(stderr, "MPI_Info_get: Invalid valuelen argument\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - if (value <= (char *) 0) { - FPRINTF(stderr, "MPI_Info_get: value is an invalid address\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - curr = info->next; - *flag = 0; - - while (curr) { - if (!strcmp(curr->key, key)) { - ADIOI_Strncpy(value, curr->value, valuelen); - value[valuelen] = '\0'; - *flag = 1; - break; - } - curr = curr->next; - } - - return MPI_SUCCESS; -} diff --git a/ompi/mca/io/romio/romio/mpi2-other/info/info_getnks.c b/ompi/mca/io/romio/romio/mpi2-other/info/info_getnks.c deleted file mode 100644 index 6806276fb0..0000000000 --- a/ompi/mca/io/romio/romio/mpi2-other/info/info_getnks.c +++ /dev/null @@ -1,55 +0,0 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ -/* - * - * Copyright (C) 1997 University of Chicago. - * See COPYRIGHT notice in top-level directory. - */ - -#include "mpioimpl.h" - -#ifdef HAVE_WEAK_SYMBOLS - -#if defined(HAVE_PRAGMA_WEAK) -#pragma weak MPI_Info_get_nkeys = PMPI_Info_get_nkeys -#elif defined(HAVE_PRAGMA_HP_SEC_DEF) -#pragma _HP_SECONDARY_DEF PMPI_Info_get_nkeys MPI_Info_get_nkeys -#elif defined(HAVE_PRAGMA_CRI_DUP) -#pragma _CRI duplicate MPI_Info_get_nkeys as PMPI_Info_get_nkeys -/* end of weak pragmas */ -#endif - -/* Include mapping from MPI->PMPI */ -#define MPIO_BUILD_PROFILING -#include "mpioprof.h" -#endif - -/*@ - MPI_Info_get_nkeys - Returns the number of currently defined keys in info - -Input Parameters: -. info - info object (handle) - -Output Parameters: -. nkeys - number of defined keys (integer) - -.N fortran -@*/ -int MPI_Info_get_nkeys(MPI_Info info, int *nkeys) -{ - MPI_Info curr; - - if ((info <= (MPI_Info) 0) || (info->cookie != MPIR_INFO_COOKIE)) { - FPRINTF(stderr, "MPI_Info_get_nkeys: Invalid info object\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - curr = info->next; - *nkeys = 0; - - while (curr) { - curr = curr->next; - (*nkeys)++; - } - - return MPI_SUCCESS; -} diff --git a/ompi/mca/io/romio/romio/mpi2-other/info/info_getnth.c b/ompi/mca/io/romio/romio/mpi2-other/info/info_getnth.c deleted file mode 100644 index 2e2978f96c..0000000000 --- a/ompi/mca/io/romio/romio/mpi2-other/info/info_getnth.c +++ /dev/null @@ -1,74 +0,0 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ -/* - * - * Copyright (C) 1997 University of Chicago. - * See COPYRIGHT notice in top-level directory. - */ - -#include "mpioimpl.h" - -#ifdef HAVE_WEAK_SYMBOLS - -#if defined(HAVE_PRAGMA_WEAK) -#pragma weak MPI_Info_get_nthkey = PMPI_Info_get_nthkey -#elif defined(HAVE_PRAGMA_HP_SEC_DEF) -#pragma _HP_SECONDARY_DEF PMPI_Info_get_nthkey MPI_Info_get_nthkey -#elif defined(HAVE_PRAGMA_CRI_DUP) -#pragma _CRI duplicate MPI_Info_get_nthkey as PMPI_Info_get_nthkey -/* end of weak pragmas */ -#endif - -/* Include mapping from MPI->PMPI */ -#define MPIO_BUILD_PROFILING -#include "mpioprof.h" -#endif - -/*@ - MPI_Info_get_nthkey - Returns the nth defined key in info - -Input Parameters: -. info - info object (handle) -. n - key number (integer) - -Output Parameters: -. keys - key (string) - -.N fortran -@*/ -int MPI_Info_get_nthkey(MPI_Info info, int n, char *key) -{ - MPI_Info curr; - int nkeys, i; - - if ((info <= (MPI_Info) 0) || (info->cookie != MPIR_INFO_COOKIE)) { - FPRINTF(stderr, "MPI_Info_get_nthkey: Invalid info object\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - if (key <= (char *) 0) { - FPRINTF(stderr, "MPI_Info_get: key is an invalid address\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - curr = info->next; - nkeys = 0; - while (curr) { - curr = curr->next; - nkeys++; - } - - if ((n < 0) || (n >= nkeys)) { - FPRINTF(stderr, "MPI_Info_get_nthkey: n is an invalid number\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - curr = info->next; - i = 0; - while (i < n) { - curr = curr->next; - i++; - } - ADIOI_Strncpy(key, curr->key, MPI_MAX_INFO_KEY); - - return MPI_SUCCESS; -} diff --git a/ompi/mca/io/romio/romio/mpi2-other/info/info_getvln.c b/ompi/mca/io/romio/romio/mpi2-other/info/info_getvln.c deleted file mode 100644 index 903b280f17..0000000000 --- a/ompi/mca/io/romio/romio/mpi2-other/info/info_getvln.c +++ /dev/null @@ -1,76 +0,0 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ -/* - * - * Copyright (C) 1997 University of Chicago. - * See COPYRIGHT notice in top-level directory. - */ - -#include "mpioimpl.h" - -#ifdef HAVE_WEAK_SYMBOLS - -#if defined(HAVE_PRAGMA_WEAK) -#pragma weak MPI_Info_get_valuelen = PMPI_Info_get_valuelen -#elif defined(HAVE_PRAGMA_HP_SEC_DEF) -#pragma _HP_SECONDARY_DEF PMPI_Info_get_valuelen MPI_Info_get_valuelen -#elif defined(HAVE_PRAGMA_CRI_DUP) -#pragma _CRI duplicate MPI_Info_get_valuelen as PMPI_Info_get_valuelen -/* end of weak pragmas */ -#endif - -/* Include mapping from MPI->PMPI */ -#define MPIO_BUILD_PROFILING -#include "mpioprof.h" -#endif - -/*@ - MPI_Info_get_valuelen - Retrieves the length of the value associated with a key - -Input Parameters: -. info - info object (handle) -. key - key (string) - -Output Parameters: -. valuelen - length of value argument (integer) -. flag - true if key defined, false if not (boolean) - -.N fortran -@*/ -int MPI_Info_get_valuelen(MPI_Info info, char *key, int *valuelen, int *flag) -{ - MPI_Info curr; - - if ((info <= (MPI_Info) 0) || (info->cookie != MPIR_INFO_COOKIE)) { - FPRINTF(stderr, "MPI_Info_get_valuelen: Invalid info object\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - if (key <= (char *) 0) { - FPRINTF(stderr, "MPI_Info_get_valuelen: key is an invalid address\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - if (strlen(key) > MPI_MAX_INFO_KEY) { - FPRINTF(stderr, "MPI_Info_get_valuelen: key is longer than MPI_MAX_INFO_KEY\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - if (!strlen(key)) { - FPRINTF(stderr, "MPI_Info_get_valuelen: key is a null string\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - curr = info->next; - *flag = 0; - - while (curr) { - if (!strcmp(curr->key, key)) { - *valuelen = strlen(curr->value); - *flag = 1; - break; - } - curr = curr->next; - } - - return MPI_SUCCESS; -} diff --git a/ompi/mca/io/romio/romio/mpi2-other/info/info_set.c b/ompi/mca/io/romio/romio/mpi2-other/info/info_set.c deleted file mode 100644 index 49574eeb01..0000000000 --- a/ompi/mca/io/romio/romio/mpi2-other/info/info_set.c +++ /dev/null @@ -1,98 +0,0 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ -/* - * - * Copyright (C) 1997 University of Chicago. - * See COPYRIGHT notice in top-level directory. - */ - -#include "mpioimpl.h" - -#ifdef HAVE_WEAK_SYMBOLS - -#if defined(HAVE_PRAGMA_WEAK) -#pragma weak MPI_Info_set = PMPI_Info_set -#elif defined(HAVE_PRAGMA_HP_SEC_DEF) -#pragma _HP_SECONDARY_DEF PMPI_Info_set MPI_Info_set -#elif defined(HAVE_PRAGMA_CRI_DUP) -#pragma _CRI duplicate MPI_Info_set as PMPI_Info_set -/* end of weak pragmas */ -#endif - -/* Include mapping from MPI->PMPI */ -#define MPIO_BUILD_PROFILING -#include "mpioprof.h" -#endif - -/*@ - MPI_Info_set - Adds a (key,value) pair to info - -Input Parameters: -. info - info object (handle) -. key - key (string) -. value - value (string) - -.N fortran -@*/ -int MPI_Info_set(MPI_Info info, char *key, char *value) -{ - MPI_Info prev, curr; - - if ((info <= (MPI_Info) 0) || (info->cookie != MPIR_INFO_COOKIE)) { - FPRINTF(stderr, "MPI_Info_set: Invalid info object\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - if (key <= (char *) 0) { - FPRINTF(stderr, "MPI_Info_set: key is an invalid address\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - if (value <= (char *) 0) { - FPRINTF(stderr, "MPI_Info_set: value is an invalid address\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - if (strlen(key) > MPI_MAX_INFO_KEY) { - FPRINTF(stderr, "MPI_Info_set: key is longer than MPI_MAX_INFO_KEY\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - if (strlen(value) > MPI_MAX_INFO_VAL) { - FPRINTF(stderr, "MPI_Info_set: value is longer than MPI_MAX_INFO_VAL\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - if (!strlen(key)) { - FPRINTF(stderr, "MPI_Info_set: key is a null string\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - if (!strlen(value)) { - FPRINTF(stderr, "MPI_Info_set: value is a null string\n"); - MPI_Abort(MPI_COMM_WORLD, 1); - } - - prev = info; - curr = info->next; - - while (curr) { - if (!strcmp(curr->key, key)) { - ADIOI_Free(curr->value); - curr->value = ADIOI_Strdup(value); - break; - } - prev = curr; - curr = curr->next; - } - - if (!curr) { - prev->next = (MPI_Info) ADIOI_Malloc(sizeof(struct MPIR_Info)); - curr = prev->next; - curr->cookie = 0; /* cookie not set on purpose */ - curr->key = ADIOI_Strdup(key); - curr->value = ADIOI_Strdup(value); - curr->next = 0; - } - - return MPI_SUCCESS; -} diff --git a/ompi/mca/io/romio/romio/test-internal/Makefile.am b/ompi/mca/io/romio/romio/test-internal/Makefile.am new file mode 100644 index 0000000000..ec7c7eb0ef --- /dev/null +++ b/ompi/mca/io/romio/romio/test-internal/Makefile.am @@ -0,0 +1,26 @@ +# -*- Mode: Makefile; -*- +# +# (C) 2011 by Argonne National Laboratory. +# See COPYRIGHT in top-level directory. +# + +# This directory is only listed in DIST_SUBDIRS, not SUBDIRS, so its contents +# will not be built by default, but it will participate in "make distclean" and +# friends. + +# override the normal compilers for the tests +CC = $(TEST_CC) + +# because := is not universally avalible, we have to play games to use the +# user-specified LDFLAGS and OUR_LIBS env. variables (if set) +OUR_LIBS = $(TEST_LIBNAME) $(MPI_LIB) $(ROMIO_LIBLIST) + +LDADD = $(OUR_LIBS) + +AM_CPPFLAGS = $(ROMIO_INCLUDE) +AM_CFLAGS = $(USER_CFLAGS) + +CTESTS = file_realms_test io_bounds_test heap_test + +noinst_PROGRAMS = $(CTESTS) + diff --git a/ompi/mca/io/romio/romio/test-internal/file_realms_test.c b/ompi/mca/io/romio/romio/test-internal/file_realms_test.c index 029fa1b61b..a4d9dadbe9 100644 --- a/ompi/mca/io/romio/romio/test-internal/file_realms_test.c +++ b/ompi/mca/io/romio/romio/test-internal/file_realms_test.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 2008 University of Chicago. * See COPYRIGHT notice in top-level directory. diff --git a/ompi/mca/io/romio/romio/test-internal/io_bounds_test.c b/ompi/mca/io/romio/romio/test-internal/io_bounds_test.c index b2a48c1be0..f7514764e4 100644 --- a/ompi/mca/io/romio/romio/test-internal/io_bounds_test.c +++ b/ompi/mca/io/romio/romio/test-internal/io_bounds_test.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * Copyright (C) 2008 University of Chicago. * See COPYRIGHT notice in top-level directory. diff --git a/ompi/mca/io/romio/romio/test/Makefile.am b/ompi/mca/io/romio/romio/test/Makefile.am new file mode 100644 index 0000000000..4906b202d5 --- /dev/null +++ b/ompi/mca/io/romio/romio/test/Makefile.am @@ -0,0 +1,43 @@ +# -*- Mode: Makefile; -*- +# +# (C) 2011 by Argonne National Laboratory. +# See COPYRIGHT in top-level directory. +# + +# This directory is only listed in DIST_SUBDIRS, not SUBDIRS, so its contents +# will not be built by default, but it will participate in "make distclean" and +# friends. + +# override the normal compilers for the tests +CC = $(TEST_CC) +F77 = $(TEST_F77) + +# because := is not universally avalible, we have to play games to use the +# user-specified LDFLAGS and OUR_LIBS env. variables (if set) +OUR_LIBS = $(TEST_LIBNAME) $(MPI_LIB) + +LDADD = $(OUR_LIBS) + +AM_CPPFLAGS = $(ROMIO_INCLUDE) +AM_CFLAGS = $(USER_CFLAGS) +AM_FFLAGS = $(USER_FFLAGS) + +CTESTS = simple perf async coll_test coll_perf misc file_info excl large_array \ + atomicity noncontig i_noncontig noncontig_coll split_coll shared_fp \ + large_file psimple error status noncontig_coll2 aggregation1 aggregation2 \ + async-multiple ordered_fp hindexed external32 +FTESTS = fcoll_test fperf fmisc pfcoll_test + + +noinst_PROGRAMS = $(CTESTS) + +if BUILD_F77_TESTS + +noinst_PROGRAMS += $(FTESTS) +fperf_SOURCES = fperf.f +fcoll_test_SOURCES = fcoll_test.f +fmisc_SOURCES = fmisc.f +pfcoll_test_SOURCES = pfcoll_test.f + +endif BUILD_F77_TESTS + diff --git a/ompi/mca/io/romio/romio/test/Makefile.in b/ompi/mca/io/romio/romio/test/Makefile.in deleted file mode 100644 index bf6ff4f097..0000000000 --- a/ompi/mca/io/romio/romio/test/Makefile.in +++ /dev/null @@ -1,58 +0,0 @@ -CC = @TEST_CC@ -F77 = @TEST_F77@ -INCLUDE_DIR = @ROMIO_INCLUDE@ -# because := is not universally avalible, we have to play games to use the -# user-specified LDFLAGS and OUR_LIBS env. variables (if set) -OUR_LIBS = @TEST_LIBNAME@ @MPI_LIB@ ${LDFLAGS} ${LIBS} -USER_CFLAGS = @CPPFLAGS@ @USER_CFLAGS@ $(INCLUDE_DIR) -USER_FFLAGS = @CPPFLAGS@ @USER_FFLAGS@ $(INCLUDE_DIR) -CTESTS = simple perf async coll_test coll_perf misc file_info excl large_array \ - atomicity noncontig i_noncontig noncontig_coll split_coll shared_fp \ - large_file psimple error status noncontig_coll2 aggregation1 aggregation2 \ - async-multiple ordered_fp hindexed -FTESTS = fcoll_test fperf fmisc pfcoll_test -srcdir=@srcdir@ - -@VPATH@ - - -all: c-test @FORTRAN_TEST@ - -c-test: $(CTESTS) - -default: all - -.c.o: - $(CC) $(USER_CFLAGS) -c $< - -.f.o: - $(F77) $(USER_FFLAGS) -c $< - -.o: - $(CC) $(USER_CFLAGS) -o $@ $< $(OUR_LIBS) - -clean: - rm -f .P* PI* *.o - rm -f $(CTESTS) $(FTESTS) - @-rm -f work.pc work.pcl - -# -# The Fortran tests must be built with the Fortran linker -fperf: fperf.o - $(F77) $(USER_FFLAGS) -o fperf fperf.o $(OUR_LIBS) - -fcoll_test: fcoll_test.o - $(F77) $(USER_FFLAGS) -o fcoll_test fcoll_test.o $(OUR_LIBS) - -fmisc: fmisc.o - $(F77) $(USER_FFLAGS) -o fmisc fmisc.o $(OUR_LIBS) - -pfcoll_test: pfcoll_test.o - $(F77) $(USER_FFLAGS) -o pfcoll_test pfcoll_test.o $(OUR_LIBS) - -#testing: -# -./runtests $(TESTARGS) - -cleanall: - -@rm -f .P* PI* misc.c large_file.c fcoll_test.f fmisc.f fperf.f \ - mpif.h $(CTESTS) $(FTESTS) *.out runtests pfcoll_test.f diff --git a/ompi/mca/io/romio/romio/test/Mfile.in b/ompi/mca/io/romio/romio/test/Mfile.in new file mode 100644 index 0000000000..6b432ac10d --- /dev/null +++ b/ompi/mca/io/romio/romio/test/Mfile.in @@ -0,0 +1,84 @@ +ALL: default + +# This is a special Makefile.in source for use by the test suite (see the +# configure in examples/test) +##### User configurable options ##### + +MPIR_HOME = @MPIR_HOME@ +CC = @MPICC@ +CLINKER = @MPICC@ +CCC = @MPICPLUSPLUS@ +CCLINKER = $(CCC) +F77 = @MPIF77@ +F90BASE = @MPIF90BASE@ +F90 = @MPIF90@ +FLINKER = @MPIF77@ +OPTFLAGS = @OPTFLAGS@ +MPIFDEP = @MPIFDEP@ +### End User configurable options ### + +SHELL = /bin/sh +prefix = @prefix@ +top_srcdir = @top_srcdir@ +srcdir = @srcdir@ +@VPATH@ + +PROFLIB = +CFLAGS = @CFLAGS@ @DEFS@ $(OPTFLAGS) +CCFLAGS = $(CFLAGS) +FFLAGS = $(OPTFLAGS) @FFLAGS@ +# Use LIBS to add any special libraries for C programs +LIBS = @LIB_PATH@ @LIB_LIST@ +# Use FLIBS to add any special libraries for Fortran programs +FLIBS = @FLIB_PATH@ @LIB_LIST@ @F77EXTRALIBS@ +EXECS = $(CTESTS) $(FTESTS) +OTHEREXECS = +CTESTS = simple perf async coll_test coll_perf misc file_info excl \ + large_array \ + atomicity noncontig i_noncontig noncontig_coll split_coll shared_fp \ + large_file psimple error status noncontig_coll2 +FTESTS = fcoll_test fperf fmisc pfcoll_test + +default: $(EXECS) + +# +# Note that runtests builds the executables as required +testing: + -./runtests $(TESTARGS) + +all: testing + +fortran_tests: $(FTESTS) +# +# The Fortran tests must be built with the Fortran linker +fperf: fperf.f + $(F77) $(USER_FFLAGS) -o $@ $< $(FLIBS) + +# Some of the Fortran tests must be derived, so their code will be in the +# LOCAL directory +fcoll_test: fcoll_test.f + $(F77) $(USER_FFLAGS) -o fcoll_test fcoll_test.f $(FLIBS) + +fmisc: fmisc.f + $(F77) $(USER_FFLAGS) -o fmisc fmisc.f $(FLIBS) + +pfcoll_test: pfcoll_test.f + $(F77) $(USER_FFLAGS) -o pfcoll_test pfcoll_test.f $(FLIBS) + +# +# Make sure that we remove executables for specific architectures +clean: + @-rm -f *.o *~ PI* $(EXECS) *.out core pt2pt.diff $(OTHEREXECS) \ + *.trace rdb.* startup.* mpif.h ${srcdir}/*.o *.stdo + @-rm -f work.pc work.pcl + @-for file in $(EXECS) Makefile ; do \ + rm -f $$file.sun4 $$file.alpha $$file.IRIX $$file.freebsd ;\ + done +.c: + $(CC) $(CFLAGS) -o $* $< $(LIBS) +.c.o: + $(CC) $(CFLAGS) -c $< +.o: + ${CLINKER} $(OPTFLAGS) -o $* $*.o $(LIBS) +.f.o: + $(F77) $(FFLAGS) -c $< diff --git a/ompi/mca/io/romio/romio/test/aggregation1.c b/ompi/mca/io/romio/romio/test/aggregation1.c index 3b3e8bef23..f12e305c83 100644 --- a/ompi/mca/io/romio/romio/test/aggregation1.c +++ b/ompi/mca/io/romio/romio/test/aggregation1.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2007 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. diff --git a/ompi/mca/io/romio/romio/test/aggregation2.c b/ompi/mca/io/romio/romio/test/aggregation2.c index 3c57c1d206..02d2629980 100644 --- a/ompi/mca/io/romio/romio/test/aggregation2.c +++ b/ompi/mca/io/romio/romio/test/aggregation2.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2007 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. diff --git a/ompi/mca/io/romio/romio/test/async-multiple.c b/ompi/mca/io/romio/romio/test/async-multiple.c index 6d4ee63f7b..e5577d9bee 100644 --- a/ompi/mca/io/romio/romio/test/async-multiple.c +++ b/ompi/mca/io/romio/romio/test/async-multiple.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- * vim: ts=8 sts=4 sw=4 noexpandtab * * (C) 2001 by Argonne National Laboratory. diff --git a/ompi/mca/io/romio/romio/test/async.c b/ompi/mca/io/romio/romio/test/async.c index fc26ea7b0e..6bfd04f576 100644 --- a/ompi/mca/io/romio/romio/test/async.c +++ b/ompi/mca/io/romio/romio/test/async.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. diff --git a/ompi/mca/io/romio/romio/test/atomicity.c b/ompi/mca/io/romio/romio/test/atomicity.c index 31e8d4228c..7797075ed9 100644 --- a/ompi/mca/io/romio/romio/test/atomicity.c +++ b/ompi/mca/io/romio/romio/test/atomicity.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. diff --git a/ompi/mca/io/romio/romio/test/big_extents.c b/ompi/mca/io/romio/romio/test/big_extents.c index 92f0df09f4..a7e3b59e77 100644 --- a/ompi/mca/io/romio/romio/test/big_extents.c +++ b/ompi/mca/io/romio/romio/test/big_extents.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2007 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. diff --git a/ompi/mca/io/romio/romio/test/coll_perf.c b/ompi/mca/io/romio/romio/test/coll_perf.c index 2d978d4aae..491746e2ec 100644 --- a/ompi/mca/io/romio/romio/test/coll_perf.c +++ b/ompi/mca/io/romio/romio/test/coll_perf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. diff --git a/ompi/mca/io/romio/romio/test/coll_test.c b/ompi/mca/io/romio/romio/test/coll_test.c index d9a96d7b97..d37b7574ae 100644 --- a/ompi/mca/io/romio/romio/test/coll_test.c +++ b/ompi/mca/io/romio/romio/test/coll_test.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. diff --git a/ompi/mca/io/romio/romio/test/creat_excl.c b/ompi/mca/io/romio/romio/test/creat_excl.c index 21b7c5ef02..858df00e8a 100644 --- a/ompi/mca/io/romio/romio/test/creat_excl.c +++ b/ompi/mca/io/romio/romio/test/creat_excl.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. diff --git a/ompi/mca/io/romio/romio/test/error.c b/ompi/mca/io/romio/romio/test/error.c index 80214799d1..ee24e96459 100644 --- a/ompi/mca/io/romio/romio/test/error.c +++ b/ompi/mca/io/romio/romio/test/error.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. diff --git a/ompi/mca/io/romio/romio/test/excl.c b/ompi/mca/io/romio/romio/test/excl.c index 89cd064633..e48bb3deee 100644 --- a/ompi/mca/io/romio/romio/test/excl.c +++ b/ompi/mca/io/romio/romio/test/excl.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. diff --git a/ompi/mca/io/romio/romio/test/external32.c b/ompi/mca/io/romio/romio/test/external32.c new file mode 100644 index 0000000000..7756caccde --- /dev/null +++ b/ompi/mca/io/romio/romio/test/external32.c @@ -0,0 +1,97 @@ +/* + * This code was written by Intel Corporation. Copyright (C) 2011-2012 Intel Corporation. + * Intel provides this material to Argonne National Laboratory subject to + * Software Grant and Corporate Contributor License Agreement dated February 8, 2012. + * + * See COPYRIGHT in top-level directory. + */ + +#include +#include +#include "mpi.h" + +#define TEST_LE 0x1 +#define TEST_BE 0x2 +#define TEST_FILENAME "test.datarep" + +#define CHECK(fn) {int errcode; errcode = (fn); if (errcode != MPI_SUCCESS) handle_error(errcode, NULL); } + +static void handle_error(int errcode, char *str) +{ + char msg[MPI_MAX_ERROR_STRING]; + int resultlen; + MPI_Error_string(errcode, msg, &resultlen); + fprintf(stderr, "%s: (%d) %s\n", str, errcode, msg); + MPI_Abort(MPI_COMM_WORLD, 1); +} + + + +void is_little_or_big_endian( char* datarep, char* c, char* c_le, int len ) { + int i, is_le = 1, is_be = 1; + for( i = 0; i < len; i++ ) { + is_le = is_le && ( c[i] == c_le[i] ); + is_be = is_be && ( c[i] == c_le[len-1-i] ); + } + printf( "%s datarep is ", datarep ); + switch ((is_le ? TEST_LE : 0x0) | (is_be ? TEST_BE : 0x0) ) { + case TEST_LE: printf( "LITTLE ENDIAN\n" ); break; + case TEST_BE: printf( "BIG ENDIAN\n" ); break; + case TEST_LE | TEST_BE: printf( "LITTLE or BIG ENDIAN\n" ); break; + default: printf( "unknown\n" ); break; + } +} + +/* This test checks if datareps given are little- or big-endian */ +int main( int argc, char* argv[] ) { + int sample_i = 123456789, i, j; + char sample_i_le[4] = {0x15,0xcd,0x5b,0x07}, c[4]; + char* datarep[3] = { "native", "external32", "internal" }; + MPI_File fileh; + int rank; + FILE* fileh_std; + + if( sizeof(int) != 4 ) { printf( "non-supported sizeof(int)=%ld\n", sizeof(int) ); return (-1); } + + MPI_Init( &argc, &argv ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + + /* For each datarep */ + for( i = 0; i < 3; i++ ) { + + /* Open file */ + CHECK(MPI_File_open( MPI_COMM_WORLD, TEST_FILENAME, + MPI_MODE_RDWR | MPI_MODE_CREATE, MPI_INFO_NULL, &fileh ) ); + + /* Set view */ + CHECK(MPI_File_set_view( fileh, 0, MPI_INT, MPI_INT, datarep[i], MPI_INFO_NULL )); + + /* Write into file */ + CHECK(MPI_File_write_at( fileh, (MPI_Offset)rank, (void*)&sample_i, 1, + MPI_INT, MPI_STATUS_IGNORE )); + + /* Close file */ + CHECK(MPI_File_close( &fileh )); + + /* Check if your datarep is little or big endian */ + MPI_Barrier( MPI_COMM_WORLD ); + if( rank == 0 ) { + fileh_std = fopen( TEST_FILENAME, "r" ); + for( j = 0; j < 4; j++ ) { + if( feof( fileh_std ) ) { printf( "unexpected eof, aborted\n" ); return (-1); } + fscanf( fileh_std, "%c", &c[j] ); + } + is_little_or_big_endian( datarep[i], c, sample_i_le, 4 ); + fclose( fileh_std ); + } + + /* Delete file */ + if( rank == 0 ) { + CHECK(MPI_File_delete( TEST_FILENAME, MPI_INFO_NULL )); + } + } + + MPI_Finalize(); + + return 0; +} diff --git a/ompi/mca/io/romio/romio/test/file_info.c b/ompi/mca/io/romio/romio/test/file_info.c index 9ff33712cb..07bf8c975b 100644 --- a/ompi/mca/io/romio/romio/test/file_info.c +++ b/ompi/mca/io/romio/romio/test/file_info.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. diff --git a/ompi/mca/io/romio/romio/test/hindexed.c b/ompi/mca/io/romio/romio/test/hindexed.c index 6e0b332555..ca9930db72 100644 --- a/ompi/mca/io/romio/romio/test/hindexed.c +++ b/ompi/mca/io/romio/romio/test/hindexed.c @@ -213,6 +213,9 @@ int main(int argc, char **argv) { fprintf(stderr, "Found %d errors\n", nr_errors); } + free(blocklengths); + free(displacements); + free(buf); MPI_Type_free(&ftype); MPI_Finalize(); return 0; diff --git a/ompi/mca/io/romio/romio/test/i_noncontig.c b/ompi/mca/io/romio/romio/test/i_noncontig.c index 6f4bfbd8f3..db5bd36f0f 100644 --- a/ompi/mca/io/romio/romio/test/i_noncontig.c +++ b/ompi/mca/io/romio/romio/test/i_noncontig.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. diff --git a/ompi/mca/io/romio/romio/test/large_array.c b/ompi/mca/io/romio/romio/test/large_array.c index 35001116ef..6cb3d4ed1a 100644 --- a/ompi/mca/io/romio/romio/test/large_array.c +++ b/ompi/mca/io/romio/romio/test/large_array.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. diff --git a/ompi/mca/io/romio/romio/test/noncontig.c b/ompi/mca/io/romio/romio/test/noncontig.c index bb435e53ac..8be18dc670 100644 --- a/ompi/mca/io/romio/romio/test/noncontig.c +++ b/ompi/mca/io/romio/romio/test/noncontig.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. diff --git a/ompi/mca/io/romio/romio/test/noncontig_coll.c b/ompi/mca/io/romio/romio/test/noncontig_coll.c index f2bc82c46c..2916776a63 100644 --- a/ompi/mca/io/romio/romio/test/noncontig_coll.c +++ b/ompi/mca/io/romio/romio/test/noncontig_coll.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. diff --git a/ompi/mca/io/romio/romio/test/noncontig_coll2.c b/ompi/mca/io/romio/romio/test/noncontig_coll2.c index e684048c12..10ad4ab34a 100644 --- a/ompi/mca/io/romio/romio/test/noncontig_coll2.c +++ b/ompi/mca/io/romio/romio/test/noncontig_coll2.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. diff --git a/ompi/mca/io/romio/romio/test/ordered_fp.c b/ompi/mca/io/romio/romio/test/ordered_fp.c index c03ccf881f..b2e0e92359 100644 --- a/ompi/mca/io/romio/romio/test/ordered_fp.c +++ b/ompi/mca/io/romio/romio/test/ordered_fp.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. diff --git a/ompi/mca/io/romio/romio/test/perf.c b/ompi/mca/io/romio/romio/test/perf.c index 85698d2466..b72cf145f8 100644 --- a/ompi/mca/io/romio/romio/test/perf.c +++ b/ompi/mca/io/romio/romio/test/perf.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. diff --git a/ompi/mca/io/romio/romio/test/psimple.c b/ompi/mca/io/romio/romio/test/psimple.c index 55022ca289..1fc91f3e22 100644 --- a/ompi/mca/io/romio/romio/test/psimple.c +++ b/ompi/mca/io/romio/romio/test/psimple.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. diff --git a/ompi/mca/io/romio/romio/test/rtest.in b/ompi/mca/io/romio/romio/test/rtest.in new file mode 100644 index 0000000000..4b9cbcc2cd --- /dev/null +++ b/ompi/mca/io/romio/romio/test/rtest.in @@ -0,0 +1,131 @@ +#! /bin/sh +# +# Run some of the tests. If any arguments are provided, pass them to the +# test programs. +# +# -mvhome is needed for the ANL SP, and is ignored by others +args=@MPIRUNARGS@ +device=@DEVICE@ +top_srcdir=@top_srcdir@ +srcdir=@srcdir@ +MPICH_VERSION=@MPICH_VERSION@ +STOPFILE=$HOME/.stopmpichtests +mpirun=${MPIRUN:-"@MPIRUN@"} +MAKE="@MAKE@" +FILENAME=test +# +# Load basic procedures +. ${top_srcdir}/runbase +# +# Set mpirun to the name/path of the mpirun program +FindMPIRUN +# +# +test_mpi2=@HAS_MPI2@ +runtests=1 +quiet=0 +makeeach=0 +writesummaryfile=no +MAKE="@MAKE@" +for arg in "$@" ; do + case $arg in + -checkonly ) + runtests=0 + ;; + -margs=*) + margs=`echo $arg | sed 's/-margs=//'` + args="$args $margs" + ;; + -summaryfile=*) + writesummaryfile=yes + summaryfile=`echo A$arg | sed 's/A-summaryfile=//'` + ;; + -small) + makeeach=1 + ;; + -fname=*) + FILENAME=`echo $arg|sed 's/-*fname=//'` + ;; + -quiet) + shift + quiet=1 + ;; + -help|-u) + echo "runtests [-checkonly] [-margs='...']" + echo "run tests in this directory. If -checkonly set, just run" + echo "the differences check (do NO rerun the test programs)." + echo "If -margs is used, these options are passed to mpirun." + echo "If -small is used, the examples are built, run, and deleted." + exit 1 + ;; + *) + if test -n "$arg" ; then + echo "runtests: Unknown argument ($arg)" + exit 1 + fi + ;; + esac +done + +# If the programs are not available, run make. +if [ ! -x simple -a $makeeach = 0 -a $runtests = 1 ] ; then + $MAKE default +fi + +testfiles="" +if [ $runtests = 1 ] ; then + + +RunTest simple 4 "**** Testing simple.c ****" "-fname $FILENAME" + +RunTest async 4 "**** Testing async.c ****" "-fname $FILENAME" + +RunTest atomicity 4 "**** Testing atomicity.out ****" "-fname $FILENAME" + +RunTest coll_test 4 "**** Testing coll_test.out ****" "-fname $FILENAME" + +RunTest excl 4 "**** Testing excl.c ****" "-fname $FILENAME" + +RunTest file_info 4 "**** Testing file_info.c ****" "-fname $FILENAME" + +RunTest i_noncontig 2 "**** Testing i_noncontig.c ****" "-fname $FILENAME" + +RunTest noncontig 2 "**** Testing noncontig.c ****" "-fname $FILENAME" + +RunTest noncontig_coll 2 "**** Testing noncontig_coll.c ****" "-fname $FILENAME" + +RunTest noncontig_coll2 4 "**** Testing noncontig_coll2.c ****" "-fname $FILENAME" + +RunTest misc 4 "**** Testing misc.c ****" "-fname $FILENAME" + +RunTest shared_fp 4 "**** Testing shared_fp.c ****" "-fname $FILENAME" + +RunTest split_coll 4 "**** Testing split_coll.c ****" "-fname $FILENAME" + +RunTest psimple 4 "**** Testing psimple.c ****" "-fname $FILENAME" + +RunTest error 1 "**** Testing error.c ****" "-fname $FILENAME" + +RunTest status 1 "**** Testing status.c ****" "-fname $FILENAME" + +# +# Run Fortran tests ONLY if Fortran available +if [ @HAS_FORTRAN@ = 1 ] ; then + RunTest fmisc 4 "**** Testing fmisc.f ****" "-fname $FILENAME" + + RunTest fcoll_test 4 "**** Testing fcoll_test.f ****" "-fname $FILENAME" + + RunTest pfcoll_test 4 "**** Testing pfcoll_test.f ****" "-fname $FILENAME" +fi + +else + # Just run checks + testfiles=`echo *.out` +fi + +echo '*** Checking for differences from expected output ***' +CheckAllOutput context.diff +exit 0 + + + diff --git a/ompi/mca/io/romio/romio/test/runtests.in b/ompi/mca/io/romio/romio/test/runtests.in index 3f17318b52..0ae23eb167 100644 --- a/ompi/mca/io/romio/romio/test/runtests.in +++ b/ompi/mca/io/romio/romio/test/runtests.in @@ -1,4 +1,7 @@ #! /bin/sh +prefix=@prefix@ +exec_prefix=@exec_prefix@ +bindir=@bindir@ mpirun="@MPIRUN@" STOPFILE=${MPITEST_STOPTEST:-"$HOME/.stopmpichtests"} # diff --git a/ompi/mca/io/romio/romio/test/shared_fp.c b/ompi/mca/io/romio/romio/test/shared_fp.c index fbc0f4083a..12dd7db1ce 100644 --- a/ompi/mca/io/romio/romio/test/shared_fp.c +++ b/ompi/mca/io/romio/romio/test/shared_fp.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. diff --git a/ompi/mca/io/romio/romio/test/simple.c b/ompi/mca/io/romio/romio/test/simple.c index 7182a4c01f..0480552705 100644 --- a/ompi/mca/io/romio/romio/test/simple.c +++ b/ompi/mca/io/romio/romio/test/simple.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. diff --git a/ompi/mca/io/romio/romio/test/split_coll.c b/ompi/mca/io/romio/romio/test/split_coll.c index da15701627..0d98b052c9 100644 --- a/ompi/mca/io/romio/romio/test/split_coll.c +++ b/ompi/mca/io/romio/romio/test/split_coll.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. diff --git a/ompi/mca/io/romio/romio/test/status.c b/ompi/mca/io/romio/romio/test/status.c index 0fc673d7a6..d64d5b2b0e 100644 --- a/ompi/mca/io/romio/romio/test/status.c +++ b/ompi/mca/io/romio/romio/test/status.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. diff --git a/ompi/mca/io/romio/romio/util/nfslock.c b/ompi/mca/io/romio/romio/util/nfslock.c index 3d37434e83..69d5e7995c 100644 --- a/ompi/mca/io/romio/romio/util/nfslock.c +++ b/ompi/mca/io/romio/romio/util/nfslock.c @@ -1,4 +1,4 @@ -/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2004 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. diff --git a/ompi/mca/io/romio/src/io_romio_component.c b/ompi/mca/io/romio/src/io_romio_component.c index 854ddd34c0..f4ea7a844f 100644 --- a/ompi/mca/io/romio/src/io_romio_component.c +++ b/ompi/mca/io/romio/src/io_romio_component.c @@ -26,7 +26,7 @@ #include "ompi/mca/io/io.h" #include "io_romio.h" -#define ROMIO_VERSION_STRING "from MPICH2 v1.3.1 with an additional patch from romio-maint@mcs.anl.gov about an attribute issue" +#define ROMIO_VERSION_STRING "from MPICH v3.0.4" /* * Private functions