-:    0:Source:/home/MPI/testing/mpich2/mpich2/src/mpi/romio/mpi-io/seek_sh.c
        -:    0:Graph:seek_sh.gcno
        -:    0:Data:seek_sh.gcda
        -:    0:Runs:537
        -:    0:Programs:143
        -:    1:/* -*- Mode: C; c-basic-offset:4 ; -*- */
        -:    2:/* 
        -:    3: *   Copyright (C) 1997 University of Chicago. 
        -:    4: *   See COPYRIGHT notice in top-level directory.
        -:    5: */
        -:    6:
        -:    7:#include "mpioimpl.h"
        -:    8:
        -:    9:#ifdef HAVE_WEAK_SYMBOLS
        -:   10:
        -:   11:#if defined(HAVE_PRAGMA_WEAK)
        -:   12:#pragma weak MPI_File_seek_shared = PMPI_File_seek_shared
        -:   13:#elif defined(HAVE_PRAGMA_HP_SEC_DEF)
        -:   14:#pragma _HP_SECONDARY_DEF PMPI_File_seek_shared MPI_File_seek_shared
        -:   15:#elif defined(HAVE_PRAGMA_CRI_DUP)
        -:   16:#pragma _CRI duplicate MPI_File_seek_shared as PMPI_File_seek_shared
        -:   17:/* end of weak pragmas */
        -:   18:#endif
        -:   19:
        -:   20:/* Include mapping from MPI->PMPI */
        -:   21:#define MPIO_BUILD_PROFILING
        -:   22:#include "mpioprof.h"
        -:   23:#endif
        -:   24:
        -:   25:/*@
        -:   26:    MPI_File_seek_shared - Updates the shared file pointer
        -:   27:
        -:   28:Input Parameters:
        -:   29:. fh - file handle (handle)
        -:   30:. offset - file offset (integer)
        -:   31:. whence - update mode (state)
        -:   32:
        -:   33:.N fortran
        -:   34:@*/
        -:   35:int MPI_File_seek_shared(MPI_File mpi_fh, MPI_Offset offset, int whence)
       48:   36:{
       48:   37:    int error_code=MPI_SUCCESS, tmp_whence, myrank;
        -:   38:    static char myname[] = "MPI_FILE_SEEK_SHARED";
        -:   39:    MPI_Offset curr_offset, eof_offset, tmp_offset;
        -:   40:    ADIO_File fh;
       48:   41:    MPIU_THREADPRIV_DECL;
        -:   42:
       48:   43:    MPIU_THREAD_CS_ENTER(ALLFUNC,);
       48:   44:    MPIR_Nest_incr();
        -:   45:
       48:   46:    fh = MPIO_File_resolve(mpi_fh);
        -:   47:
        -:   48:    /* --BEGIN ERROR HANDLING-- */
       48:   49:    MPIO_CHECK_FILE_HANDLE(fh, myname, error_code);
       48:   50:    MPIO_CHECK_NOT_SEQUENTIAL_MODE(fh, myname, error_code);
       48:   51:    MPIO_CHECK_FS_SUPPORTS_SHARED(fh, myname, error_code);
        -:   52:    /* --END ERROR HANDLING-- */
        -:   53:
       48:   54:    tmp_offset = offset;
       48:   55:    MPI_Bcast(&tmp_offset, 1, ADIO_OFFSET, 0, fh->comm);
        -:   56:    /* --BEGIN ERROR HANDLING-- */
       48:   57:    if (tmp_offset != offset)
        -:   58:    {
    #####:   59:	error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
        -:   60:					  myname, __LINE__, MPI_ERR_ARG,
        -:   61:					  "**notsame", 0);
    #####:   62:	error_code = MPIO_Err_return_file(fh, error_code);
    #####:   63:	goto fn_exit;
        -:   64:    }
        -:   65:    /* --END ERROR HANDLING-- */
        -:   66:
       48:   67:    tmp_whence = whence;
       48:   68:    MPI_Bcast(&tmp_whence, 1, MPI_INT, 0, fh->comm);
        -:   69:    /* --BEGIN ERROR HANDLING-- */
       48:   70:    if (tmp_whence != whence)
        -:   71:    {
    #####:   72:	error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
        -:   73:					  myname, __LINE__, MPI_ERR_ARG,
        -:   74:					  "**iobadwhence", 0);
    #####:   75:	error_code = MPIO_Err_return_file(fh, error_code);
    #####:   76:	goto fn_exit;
        -:   77:    }
        -:   78:    /* --END ERROR HANDLING-- */
        -:   79:
       48:   80:    ADIOI_TEST_DEFERRED(fh, "MPI_File_seek_shared", &error_code);
        -:   81:
       48:   82:    MPI_Comm_rank(fh->comm, &myrank);
        -:   83:
       48:   84:    if (!myrank)
        -:   85:    {
       12:   86:	switch(whence)
        -:   87:	{
        -:   88:	case MPI_SEEK_SET:
        -:   89:	    /* --BEGIN ERROR HANDLING-- */
       11:   90:	    if (offset < 0)
        -:   91:	    {
    #####:   92:		error_code = MPIO_Err_create_code(MPI_SUCCESS,
        -:   93:						  MPIR_ERR_RECOVERABLE,
        -:   94:						  myname, __LINE__,
        -:   95:						  MPI_ERR_ARG,
        -:   96:						  "**iobadoffset", 0);
    #####:   97:		error_code = MPIO_Err_return_file(fh, error_code);
    #####:   98:		goto fn_exit;
        -:   99:	    }
        -:  100:	    /* --END ERROR HANDLING-- */
        -:  101:	    break;
        -:  102:	case MPI_SEEK_CUR:
        -:  103:	    /* get current location of shared file pointer */
    #####:  104:	    ADIO_Get_shared_fp(fh, 0, &curr_offset, &error_code);
        -:  105:	    /* --BEGIN ERROR HANDLING-- */
    #####:  106:	    if (error_code != MPI_SUCCESS)
        -:  107:	    {
    #####:  108:		error_code = MPIO_Err_create_code(MPI_SUCCESS,
        -:  109:						  MPIR_ERR_FATAL,
        -:  110:						  myname, __LINE__,
        -:  111:						  MPI_ERR_INTERN, 
        -:  112:						  "**iosharedfailed", 0);
    #####:  113:		error_code = MPIO_Err_return_file(fh, error_code);
    #####:  114:		goto fn_exit;
        -:  115:	    }
        -:  116:	    /* --END ERROR HANDLING-- */
    #####:  117:	    offset += curr_offset;
        -:  118:	    /* --BEGIN ERROR HANDLING-- */
    #####:  119:	    if (offset < 0)
        -:  120:	    {
    #####:  121:		error_code = MPIO_Err_create_code(MPI_SUCCESS,
        -:  122:						  MPIR_ERR_RECOVERABLE,
        -:  123:						  myname, __LINE__,
        -:  124:						  MPI_ERR_ARG,
        -:  125:						  "**ionegoffset", 0);
    #####:  126:		error_code = MPIO_Err_return_file(fh, error_code);
    #####:  127:		goto fn_exit;
        -:  128:	    }
        -:  129:	    /* --END ERROR HANDLING-- */
        -:  130:	    break;
        -:  131:	case MPI_SEEK_END:
        -:  132:	    /* find offset corr. to end of file */
        1:  133:	    ADIOI_Get_eof_offset(fh, &eof_offset);
        1:  134:	    offset += eof_offset;
        -:  135:	    /* --BEGIN ERROR HANDLING-- */
        1:  136:	    if (offset < 0)
        -:  137:	    {
    #####:  138:		error_code = MPIO_Err_create_code(MPI_SUCCESS,
        -:  139:						  MPIR_ERR_RECOVERABLE,
        -:  140:						  myname, __LINE__,
        -:  141:						  MPI_ERR_ARG,
        -:  142:						  "**ionegoffset", 0);
    #####:  143:		error_code = MPIO_Err_return_file(fh, error_code);
    #####:  144:		goto fn_exit;
        -:  145:	    }
        -:  146:	    /* --END ERROR HANDLING-- */
        -:  147:	    break;
        -:  148:	default:
        -:  149:	    /* --BEGIN ERROR HANDLING-- */
    #####:  150:	    error_code = MPIO_Err_create_code(MPI_SUCCESS,
        -:  151:					      MPIR_ERR_RECOVERABLE,
        -:  152:					      myname, __LINE__, MPI_ERR_ARG,
        -:  153:					      "**iobadwhence", 0);
    #####:  154:	    error_code = MPIO_Err_return_file(fh, error_code);
    #####:  155:	    goto fn_exit;
        -:  156:	    /* --END ERROR HANDLING-- */
        -:  157:	}
        -:  158:
       12:  159:	ADIO_Set_shared_fp(fh, offset, &error_code);
        -:  160:	/* --BEGIN ERROR HANDLING-- */
       12:  161:	if (error_code != MPI_SUCCESS)
        -:  162:	{
    #####:  163:	    error_code = MPIO_Err_create_code(MPI_SUCCESS,
        -:  164:					      MPIR_ERR_FATAL,
        -:  165:					      myname, __LINE__,
        -:  166:					      MPI_ERR_INTERN, 
        -:  167:					      "**iosharedfailed", 0);
    #####:  168:	    error_code = MPIO_Err_return_file(fh, error_code);
    #####:  169:	    goto fn_exit;
        -:  170:	}
        -:  171:	/* --END ERROR HANDLING-- */
        -:  172:
        -:  173:    }
        -:  174:
        -:  175:    /* FIXME: explain why the barrier is necessary */
       48:  176:    MPI_Barrier(fh->comm);
        -:  177:
       48:  178:    error_code = MPI_SUCCESS;
        -:  179:
       48:  180:fn_exit:
       48:  181:    MPIR_Nest_decr();
       48:  182:    MPIU_THREAD_CS_EXIT(ALLFUNC,);
        -:  183:
       48:  184:    return error_code;
        -:  185:}