1
1

continuing to check in matching code - wild matcing is all checked in.

Adding support function (lam_list_remove_item) to lam_list_t, and the
macro LAM_ANY_TAG, which is #defined to MPI_ANY_TAG to avoid a
translation step.

This commit was SVN r338.
Этот коммит содержится в:
Rich Graham 2004-01-13 23:26:14 +00:00
родитель 7f614d49cc
Коммит 8f7df50dfd
3 изменённых файлов: 68 добавлений и 44 удалений

Просмотреть файл

@ -5,6 +5,8 @@
#ifndef LAM_LIST_H #ifndef LAM_LIST_H
#define LAM_LIST_H #define LAM_LIST_H
#include <stdio.h>
#include "lam/lfc/object.h" #include "lam/lfc/object.h"
/* /*
@ -84,13 +86,12 @@ static inline void lam_list_set_size(lam_list_t* list, size_t size)
list->lam_list_length=size; list->lam_list_length=size;
} }
/* /*
* Returns first item on list, but does not remove it from the list. * Returns first item on list, but does not remove it from the list.
*/ */
static inline lam_list_item_t* lam_list_get_first(lam_list_t* list) static inline lam_list_item_t* lam_list_get_first(lam_list_t* list)
{ {
return 0; return list->lam_list_head.lam_list_next;
} }
/* /*
@ -98,7 +99,7 @@ static inline lam_list_item_t* lam_list_get_first(lam_list_t* list)
*/ */
static inline lam_list_item_t* lam_list_get_last(lam_list_t* list) static inline lam_list_item_t* lam_list_get_last(lam_list_t* list)
{ {
return 0; return list->lam_list_tail.lam_list_prev;
} }
/* /*
@ -106,9 +107,43 @@ static inline lam_list_item_t* lam_list_get_last(lam_list_t* list)
*/ */
static inline lam_list_item_t* lam_list_get_end(lam_list_t* list) static inline lam_list_item_t* lam_list_get_end(lam_list_t* list)
{ {
return 0; return &(list->lam_list_tail);
} }
/*
* Removes the specified item from the list
*/
static inline void lam_list_remove_item(lam_list_t *list, lam_list_item_t *item){
#ifdef LAM_ENABLE_DEBUG
lam_list_item_t *item_ptr;
int found=0;
#endif
#ifdef LAM_ENABLE_DEBUG
/* check to see that the item is in the list */
for(item_ptr = lam_list_get_first(list);
item_ptr != lam_list_get_end(list);
item_ptr = item_ptr->lam_list_next) {
if( item_ptr == item ) {
found=1;
break;
}
}
if( 1 != found){
fprintf(stderr," Warning :: lam_list_remove_item - the item %p is not on the list %p \n",item,list);
fflush(stderr);
}
#endif
/* reset next pointer of previous element */
item->lam_list_prev->lam_list_next=item->lam_list_next;
/* reset previous pointer of next element */
item->lam_list_next->lam_list_prev=item->lam_list_prev;
return;
}
/* /*
* Adds item to the end of the list but does not retain item. * Adds item to the end of the list but does not retain item.

Просмотреть файл

@ -13,6 +13,7 @@
#include "mpi/datatype/datatype.h" #include "mpi/datatype/datatype.h"
#include "mpi/request/request.h" #include "mpi/request/request.h"
#include "mca/mca.h" #include "mca/mca.h"
#include "mpi.h" /* needed for MPI_ANY_TAG */
/* /*
@ -44,6 +45,8 @@ struct mca_pml_base_status_t {
}; };
typedef struct mca_pml_base_status_t mca_pml_base_status_t; typedef struct mca_pml_base_status_t mca_pml_base_status_t;
#define LAM_ANY_TAG MPI_ANY_TAG
/* /*
* PML interface functions * PML interface functions

Просмотреть файл

@ -15,6 +15,7 @@
#include "mca/mpi/pml/base/pml_base_comm.h" #include "mca/mpi/pml/base/pml_base_comm.h"
#include "lam/lfc/list.h" #include "lam/lfc/list.h"
#include "mca/mpi/ptl/base/ptl_base_match.h" #include "mca/mpi/ptl/base/ptl_base_match.h"
#include "mca/mpi/pml/pml.h"
/** /**
* RCS/CTS receive side matching * RCS/CTS receive side matching
@ -245,63 +246,48 @@ mca_pml_base_recv_request_t *check_wild_receives_for_match(
/* local parameters */ /* local parameters */
mca_pml_base_recv_request_t *return_match; mca_pml_base_recv_request_t *return_match;
mca_pml_base_recv_request_t *wild_recv; mca_pml_base_recv_request_t *wild_recv;
int frag_user_tag; int frag_user_tag,recv_user_tag;
/* initialization */ /* initialization */
return_match=(mca_pml_base_recv_request_t *)NULL; return_match=(mca_pml_base_recv_request_t *)NULL;
frag_user_tag=frag_header->hdr_base.hdr_user_tag; frag_user_tag=frag_header->hdr_base.hdr_user_tag;
#if (0)
/* /*
* Loop over the wild irecvs. * Loop over the wild irecvs - no need to lock, the upper level
* wild_receives * locking is protecting from having other threads trying to
* change this list.
*/ */
for(wild_recv = (mca_pml_base_recv_request_t *) for(wild_recv = (mca_pml_base_recv_request_t *)
lam_list_get_first(&(pml_comm->wild_receives)); lam_list_get_first(&(pml_comm->wild_receives));
privateQueues.PostedWildRecv.begin(); wild_recv != (mca_pml_base_recv_request_t *)
wild_recv != lam_list_get_end(&(pml_comm->wild_receives));
(RecvDesc_t *) privateQueues.PostedWildRecv.end(); wild_recv = (mca_pml_base_recv_request_t *)
wild_recv = (RecvDesc_t *) wild_recv->next) { ((lam_list_item_t *)wild_recv)->lam_list_next) {
// sanity check
assert(wild_recv->WhichQueue == POSTEDWILDIRECV);
// recv_user_tag = wild_recv->super.req_tag;
// If we have a match... if (
// /* exact tag match */
int PostedIrecvTag = wild_recv->posted_m.tag_m; (frag_user_tag == recv_user_tag) ||
if ((FragUserTag == PostedIrecvTag) || /* wild tag match - negative tags (except for
(PostedIrecvTag == ULM_ANY_TAG)) { * LAM_ANY_TAG) are reserved for internal use, and will
if (PostedIrecvTag == ULM_ANY_TAG && FragUserTag < 0) { * not be matched with LAM_ANY_TAG */
continue; ( (recv_user_tag == LAM_ANY_TAG) && (0 <= frag_user_tag) ) )
}
// {
// fill in received data information /*
// * Mark that this is the matching irecv, and go to process it.
wild_recv->isendSeq_m = rec->isendSeq_m; */
wild_recv->reslts_m.length_m = rec->msgLength_m;
wild_recv->reslts_m.peer_m = rec->srcProcID_m;
wild_recv->reslts_m.tag_m = rec->tag_m;
//
// Mark that this is the matching irecv, and go
// to process it.
//
return_match = wild_recv; return_match = wild_recv;
// remove this irecv from the postd wild ireceive list /* remove this irecv from the postd wild ireceive list */
privateQueues.PostedWildRecv.RemoveLinkNoLock(wild_recv); lam_list_remove_item(&(pml_comm->wild_receives),
(lam_list_item_t *)wild_recv);
// add this descriptor to the matched wild ireceive list /* found match - no need to continue */
wild_recv->WhichQueue = WILDMATCHEDIRECV;
privateQueues.MatchedRecv[rec->srcProcID_m]->
Append(wild_recv);
// exit the loop
break; break;
} }
} }
// //
#endif /* if(0) */
return return_match; return return_match;
} }