1
1
openmpi/ompi/mca/pml/dr/pml_dr_vfrag.h
Brian Barrett 27cea44a9c Fix a number of issues with the ompi_ptr_t:
* Make sure that the pval always writes to the correct portion of the
    lval.  This only matters on 32 bit big endian machines.
  * On 32 bit machines when assigning to pval, the other 4 bytes of lval
    weren't being written, which could lead to bogus data

We use macros so that there aren't casts all over the code and the pval
assignment can occur to the correct 4 bytes.  Refs trac:587

This commit was SVN r12974.

The following Trac tickets were found above:
  Ticket 587 --> https://svn.open-mpi.org/trac/ompi/ticket/587
2007-01-03 19:47:48 +00:00

158 строки
5.7 KiB
C

/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2005 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2006 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2006 Los Alamos National Security, LLC. All rights
* reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
/**
* @file
*/
#ifndef OMPI_PML_DR_VFRAG_H_
#define OMPI_PML_DR_VFRAG_H_
#include "ompi_config.h"
#include "opal/event/event.h"
#include "pml_dr.h"
#if defined(c_plusplus) || defined(__cplusplus)
extern "C" {
#endif
#define MCA_PML_DR_VFRAG_NACKED 0x01
#define MCA_PML_DR_VFRAG_RNDV 0x02
#define MCA_PML_DR_VFRAG_RETRANS 0x04
struct mca_pml_dr_vfrag_t {
ompi_free_list_item_t super;
ompi_ptr_t vf_send;
ompi_ptr_t vf_recv;
uint32_t vf_id;
uint16_t vf_idx;
uint16_t vf_len;
size_t vf_offset;
size_t vf_size;
size_t vf_max_send_size;
uint64_t vf_ack;
uint64_t vf_mask;
int64_t vf_pending;
uint32_t vf_state;
struct mca_bml_base_btl_t* bml_btl;
/* we need a timer for the vfrag for:
1) a watchdog timer for local completion of the current
operation
2) a timeout for ACK of the VRAG
*/
struct timeval vf_wdog_tv;
opal_event_t vf_wdog_ev;
uint8_t vf_wdog_cnt;
struct timeval vf_ack_tv;
opal_event_t vf_ack_ev;
uint8_t vf_ack_cnt;
};
typedef struct mca_pml_dr_vfrag_t mca_pml_dr_vfrag_t;
OBJ_CLASS_DECLARATION(mca_pml_dr_vfrag_t);
#define MCA_PML_DR_VFRAG_ALLOC(vfrag,rc) \
do { \
ompi_free_list_item_t* item; \
OMPI_FREE_LIST_WAIT(&mca_pml_dr.vfrags, item, rc); \
vfrag = (mca_pml_dr_vfrag_t*)item; \
} while(0)
#define MCA_PML_DR_VFRAG_RETURN(vfrag) \
do { \
OMPI_FREE_LIST_RETURN(&mca_pml_dr.vfrags, \
(ompi_free_list_item_t*)vfrag); \
} while(0)
#define MCA_PML_DR_VFRAG_INIT(vfrag) \
do { \
(vfrag)->vf_idx = 0; \
(vfrag)->vf_ack = 0; \
(vfrag)->vf_wdog_cnt = 0; \
(vfrag)->vf_ack_cnt = 0; \
OMPI_PTR_SET_PVAL((vfrag)->vf_recv, NULL); \
(vfrag)->vf_state = 0; \
(vfrag)->vf_pending = 0; \
(vfrag)->vf_wdog_tv = mca_pml_dr.wdog_timer; \
(vfrag)->vf_ack_tv = mca_pml_dr.ack_timer; \
} while(0)
/*
* Watchdog Timer
*/
#define MCA_PML_DR_VFRAG_WDOG_START(vfrag) \
do { \
opal_event_add(&(vfrag)->vf_wdog_ev, &(vfrag)->vf_wdog_tv); \
} while(0)
#define MCA_PML_DR_VFRAG_WDOG_STOP(vfrag) \
do { \
opal_event_del(&(vfrag)->vf_wdog_ev); \
} while(0)
#define MCA_PML_DR_VFRAG_WDOG_RESET(vfrag) \
do { \
opal_event_del(&(vfrag)->vf_wdog_ev); \
opal_event_add(&(vfrag)->vf_wdog_ev, &vfrag->vf_wdog_tv); \
} while(0)
/*
* Ack Timer
*/
#define MCA_PML_DR_VFRAG_ACK_START(vfrag) \
do { \
opal_event_add(&(vfrag)->vf_ack_ev, &(vfrag)->vf_ack_tv); \
} while(0)
#define MCA_PML_DR_VFRAG_ACK_STOP(vfrag) \
do { \
opal_event_del(&vfrag->vf_ack_ev); \
} while(0)
#define MCA_PML_DR_VFRAG_ACK_RESET(vfrag) \
do { \
MCA_PML_DR_VFRAG_ACK_STOP(vfrag); \
MCA_PML_DR_VFRAG_ACK_START(vfrag); \
} while(0)
/**
* Reset a VFRAG to use a new BTL
*/
void mca_pml_dr_vfrag_reset(mca_pml_dr_vfrag_t*);
/**
* Reschedule a vfrag that has timed out
*/
void mca_pml_dr_vfrag_reschedule(mca_pml_dr_vfrag_t*);
#if defined(c_plusplus) || defined(__cplusplus)
}
#endif
#endif