/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. * */ #ifndef MPIR_STATUS_H_INCLUDED #define MPIR_STATUS_H_INCLUDED /* We use bits from the "count_lo" and "count_hi_and_cancelled" fields * to represent the 'count' and 'cancelled' objects. The LSB of the * "count_hi_and_cancelled" field represents the 'cancelled' object. * The 'count' object is split between the "count_lo" and * "count_hi_and_cancelled" fields, with the lower order bits going * into the "count_lo" field, and the higher order bits goin into the * "count_hi_and_cancelled" field. This gives us 2N-1 bits for the * 'count' object, where N is the size of int. However, the value * returned to the user is bounded by the definition on MPI_Count. */ /* NOTE: The below code assumes that the count value is never * negative. For negative values, right-shifting can have weird * implementation specific consequences. */ #define MPIR_STATUS_SET_COUNT(status_, count_) \ { \ (status_).count_lo = ((int) count_); \ (status_).count_hi_and_cancelled &= 1; \ (status_).count_hi_and_cancelled |= (int) (((MPIR_Ucount) count_) >> (8 * SIZEOF_INT) << 1); \ } #define MPIR_STATUS_GET_COUNT(status_) \ ((MPI_Count) ((((MPIR_Ucount) (((unsigned int) (status_).count_hi_and_cancelled) >> 1)) << (8 * SIZEOF_INT)) + (unsigned int) (status_).count_lo)) #define MPIR_STATUS_SET_CANCEL_BIT(status_, cancelled_) \ { \ (status_).count_hi_and_cancelled &= ~1; \ (status_).count_hi_and_cancelled |= cancelled_; \ } #define MPIR_STATUS_GET_CANCEL_BIT(status_) ((status_).count_hi_and_cancelled & 1) /* Do not set MPI_ERROR (only set if ERR_IN_STATUS is returned */ #define MPIR_Status_set_empty(status_) \ { \ if ((status_) != MPI_STATUS_IGNORE) \ { \ (status_)->MPI_SOURCE = MPI_ANY_SOURCE; \ (status_)->MPI_TAG = MPI_ANY_TAG; \ MPIR_STATUS_SET_COUNT(*(status_), 0); \ MPIR_STATUS_SET_CANCEL_BIT(*(status_), FALSE); \ } \ } /* See MPI 1.1, section 3.11, Null Processes */ /* Do not set MPI_ERROR (only set if ERR_IN_STATUS is returned */ #define MPIR_Status_set_procnull(status_) \ { \ if ((status_) != MPI_STATUS_IGNORE) \ { \ (status_)->MPI_SOURCE = MPI_PROC_NULL; \ (status_)->MPI_TAG = MPI_ANY_TAG; \ MPIR_STATUS_SET_COUNT(*(status_), 0); \ MPIR_STATUS_SET_CANCEL_BIT(*(status_), FALSE); \ } \ } #endif /* MPIR_STATUS_H_INCLUDED */