/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. */ #ifndef MPIBSEND_H_INCLUDED #define MPIBSEND_H_INCLUDED /* This file is separated out as it is used by the configure script to * find the Bsend overhead value. */ /* * Description of the Bsend data structures. * * Bsend is buffered send; a buffer, provided by the user, is used to store * both the user's message and information that my be needed to send that * message. In addition, space within that buffer must be allocated, so * additional information is required to manage that space allocation. * In the following, the term "segment" denotes a fragment of the user buffer * that has been allocated either to free (unused) space or to a particular * user message. * * The following datastructures are used: * * BsendMsg_t - Describes a user message, including the values of tag * and datatype (*could* be used incase the data is already * contiguous; see below) * BsendData_t - Describes a segment of the user buffer. This data structure * contains a BsendMsg_t for segments that contain a user * message. Each BsendData_t segment belongs to one of * three lists: avail (unused and free), active (currently * sending) and pending (contains a user message that has * not begun sending because of some resource limit, such * as no more MPID requests available). * BsendBuffer - This global structure contains pointers to the user buffer * and the three lists, along with the size of the user buffer. * */ /* Used to communication the type of bsend */ typedef enum { BSEND = 0, IBSEND = 1, BSEND_INIT = 2 } MPIR_Bsend_kind_t; struct MPID_Request; struct MPID_Comm; /* BsendMsg is used to hold all of the message particulars in case a request is not currently available */ typedef struct MPIR_Bsend_msg { void *msgbuf; MPI_Aint count; MPI_Datatype dtype; int tag; struct MPID_Comm *comm_ptr; int dest; } MPIR_Bsend_msg_t; /* BsendData describes a bsend request */ typedef struct MPIR_Bsend_data { size_t size; /* size that is available for data */ size_t total_size; /* total size of this segment, including all headers */ struct MPIR_Bsend_data *next, *prev; MPIR_Bsend_kind_t kind; struct MPID_Request *request; MPIR_Bsend_msg_t msg; double alignpad; /* make sure that the struct shares double alignment */ } MPIR_Bsend_data_t; #endif /* MPIBSEND_H_INCLUDED */