/* Free the storage associated with a window object */ void MTestFreeWin(MPI_Win * win) { void *addr; int flag, merr; merr = MPI_Win_get_attr(*win, MPI_WIN_BASE, &addr, &flag); if (merr) MTestPrintError(merr); if (!flag) { MTestError("Could not get WIN_BASE from window"); } if (addr) { void *val; merr = MPI_Win_get_attr(*win, mem_keyval, &val, &flag); if (merr) MTestPrintError(merr); if (flag) { if (val == (void *) 1) { free(addr); } else if (val == (void *) 2) { merr = MPI_Free_mem(addr); if (merr) MTestPrintError(merr); } /* if val == (void *)0, then static data that must not be freed */ } } merr = MPI_Win_free(win); if (merr) MTestPrintError(merr); }
void cmpif2readwin_( MPI_Fint *fwin, MPI_Fint *fkey, MPI_Aint *expected, MPI_Fint *errs, const char *msg, int msglen ) { void *attrval; int flag, result; MPI_Win win = MPI_Win_f2c( *fwin ); char lmsg[MAX_ATTRTEST_MSG]; if (msglen > sizeof(lmsg)- 1) { fprintf( stderr, "Message too long for buffer (%d)\n", msglen ); MPI_Abort( MPI_COMM_WORLD, 1 ); } MPI_Win_get_attr( win, *fkey, &attrval, &flag ); if (!flag) { *errs = *errs + 1; strncpy( lmsg, msg, msglen ); lmsg[msglen] = 0; printf( " Error: flag false for Win_get_attr (set in F2): %s\n", lmsg ); return; } ccompareaint2void_( expected, attrval, &result ); if (!result) { *errs = *errs + 1; strncpy( lmsg, msg, msglen ); lmsg[msglen] = 0; printf( " Error: (set in F2/Win) expected %ld but saw %ld: %s\n", (long)*expected, (long)*(MPI_Aint*)attrval, lmsg ); return; } return; }
int cmpi2readwin( MPI_Win win, int key, void *expected, const char *msg ) { void *attrval; int flag; MPI_Win_get_attr( win, key, &attrval, &flag ); if (!flag) { printf( " Error: flag false for Win_get_attr: %s\n", msg ); return 1; } if (attrval != expected) { printf( " Error: expected %p but saw %p: %s\n", expected, attrval, msg ); return 1; } return 0; }
static void getTimeStepData() { int modelID; char text[1024]; int nProcsModel = commInqNProcsModel (); void *getWinBaseAddr; int attrFound; xdebug("%s", "START"); for ( modelID = 0; modelID < nProcsModel; modelID++ ) clearModelWinBuffer(modelID); // todo put in correct lbs and ubs xmpi(MPI_Win_start(groupModel, 0, getWin)); xmpi(MPI_Win_get_attr(getWin, MPI_WIN_BASE, &getWinBaseAddr, &attrFound)); xassert(attrFound); for ( modelID = 0; modelID < nProcsModel; modelID++ ) { xdebug("modelID=%d, nProcsModel=%d, rxWin[%d].size=%zu," " getWin=%p, sizeof(int)=%u", modelID, nProcsModel, modelID, rxWin[modelID].size, getWinBaseAddr, (unsigned)sizeof(int)); /* FIXME: this needs to use MPI_PACK for portability */ xmpi(MPI_Get(rxWin[modelID].buffer, (int)rxWin[modelID].size, MPI_UNSIGNED_CHAR, modelID, 0, (int)rxWin[modelID].size, MPI_UNSIGNED_CHAR, getWin)); } xmpi ( MPI_Win_complete ( getWin )); if ( ddebug > 2 ) for ( modelID = 0; modelID < nProcsModel; modelID++ ) { sprintf(text, "rxWin[%d].size=%zu from PE%d rxWin[%d].buffer", modelID, rxWin[modelID].size, modelID, modelID); xprintArray(text, rxWin[modelID].buffer, (int)(rxWin[modelID].size / sizeof (double)), DATATYPE_FLT); } readGetBuffers(); xdebug("%s", "RETURN"); }
/* * Class: mpi_Win * Method: getAttr_predefined * Signature: (JI)Ljava/lang/Object; */ JNIEXPORT jobject JNICALL Java_mpi_Win_getAttr( JNIEnv *env, jobject jthis, jlong win, jint keyval) { int flag; void *val; int rc = MPI_Win_get_attr((MPI_Win)win, keyval, &val, &flag); if(ompi_java_exceptionCheck(env, rc) || !flag) return NULL; switch(keyval) { case MPI_WIN_SIZE: return ompi_java_Integer_valueOf(env, (jint)(*((MPI_Aint*)val))); case MPI_WIN_DISP_UNIT: return ompi_java_Integer_valueOf(env, (jint)(*((int*)val))); case MPI_WIN_BASE: return ompi_java_Long_valueOf(env, (jlong)val); default: return ompi_java_attrGet(env, val); } }