#include <stdio.h>
#include "mpe.h"
int MPE_GetTags( comm_in, ntags, comm_out, first_tag )
MPI_Comm comm_in, *comm_out;
int ntags, *first_tag;
These tags are guarenteed to be unique within comm_out.
if (MPE_Tag_keyval == MPI_KEYVAL_INVALID) { MPI_Keyval_create( MPI_NULL_COPY_FN, MPE_DelTag, &MPE_Tag_keyval, (void *)0 ); }
if ((mpe_errno = MPI_Attr_get( comm_in, MPE_Tag_keyval, &tagvalp, &flag ))) return mpe_errno;
if (!flag) { /* This communicator is not yet known to this system, so we dup it and setup the first value */ MPI_Comm_dup( comm_in, comm_out ); comm_in = *comm_out; MPI_Attr_get( MPI_COMM_WORLD, MPI_TAG_UB, &maxval, &flag ); tagvalp = (int *)malloc( 2 * sizeof(int) ); if (!tagvalp) return MPI_ERR_OTHER; *tagvalp = *maxval; *first_tag = *tagvalp - ntags; *tagvalp = *first_tag; MPI_Attr_put( comm_in, MPE_Tag_keyval, tagvalp ); return MPI_SUCCESS; } *comm_out = comm_in;
if (*tagvalp < ntags) { /* Error, out of tags. Another solution would be to do an MPI_Comm_dup. */ return MPI_ERR_INTERN; } *first_tag = *tagvalp - ntags; *tagvalp = *first_tag;
return MPI_SUCCESS; }
/* This is a simple implementation that will lose track of tags that are not returned in a stack fashion. */
/*@ MPE_ReturnTags - Returns tags allocated with MPE_GetTags.
if ((mpe_errno = MPI_Attr_get( comm, MPE_Tag_keyval, &tagvalp, &flag ))) return mpe_errno;
if (!flag) { /* Error, attribute does not exist in this communicator */ return MPI_ERR_OTHER; } if (*tagvalp == first_tag) { *tagvalp = first_tag + ntags; }
return MPI_SUCCESS; }
/*@ MPE_TagsEnd - Returns the private keyval.
Location:privtags.c