From c5445843877621759c35aba9689d78d15d617cde Mon Sep 17 00:00:00 2001 From: Brian Barrett Date: Thu, 23 Feb 2006 06:02:10 +0000 Subject: [PATCH] * fix a race condition where a sendreq could be reused if it was originally for a Get request and the reply came in before the local completion callback was fired from the btl. * Silence some more debugging output for the moment This commit was SVN r9130. --- ompi/mca/osc/pt2pt/osc_pt2pt_data_move.c | 12 +++++++++--- ompi/mca/osc/pt2pt/osc_pt2pt_sync.c | 8 ++++---- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/ompi/mca/osc/pt2pt/osc_pt2pt_data_move.c b/ompi/mca/osc/pt2pt/osc_pt2pt_data_move.c index 0f2e745908..809b1fbdb1 100644 --- a/ompi/mca/osc/pt2pt/osc_pt2pt_data_move.c +++ b/ompi/mca/osc/pt2pt/osc_pt2pt_data_move.c @@ -1,4 +1,3 @@ - /* * Copyright (c) 2004-2005 The Trustees of Indiana University. * All rights reserved. @@ -97,7 +96,14 @@ ompi_osc_pt2pt_sendreq_send_cb(struct mca_btl_base_module_t* btl, return; } - if (OMPI_OSC_PT2PT_GET != sendreq->req_type) { + /* have to look at header, and not the sendreq because in the case + of get, it's possible that the sendreq has been freed already + (if the remote side replies before we get our send completion + callback) and already allocated to another request. We don't + wait for this completion before exiting a synchronization point + in the case of get, as we really don't care when it completes - + only when the data arrives. */ + if (OMPI_OSC_PT2PT_HDR_GET != header->hdr_base.hdr_type) { /* do we need to post a send? */ if (header->hdr_msg_length != 0) { /* sendreq is done. Mark it as so and get out of here */ @@ -726,7 +732,7 @@ ompi_osc_pt2pt_replyreq_recv(ompi_osc_pt2pt_module_t *module, /********************************************************************** * - * Recveive a get on the origin side + * Control message communication * **********************************************************************/ static void diff --git a/ompi/mca/osc/pt2pt/osc_pt2pt_sync.c b/ompi/mca/osc/pt2pt/osc_pt2pt_sync.c index 0fb37ef57b..aa0b9673bd 100644 --- a/ompi/mca/osc/pt2pt/osc_pt2pt_sync.c +++ b/ompi/mca/osc/pt2pt/osc_pt2pt_sync.c @@ -504,7 +504,7 @@ ompi_osc_pt2pt_passive_lock(ompi_osc_pt2pt_module_t *module, module->p2p_lock_status = MPI_LOCK_EXCLUSIVE; send_ack = true; } else { - opal_output(0, "%d queuing lock request from %d (%d)", + opal_output(-1, "%d queuing lock request from %d (%d)", module->p2p_comm->c_my_rank, origin, lock_type); new_pending = OBJ_NEW(ompi_osc_pt2pt_pending_lock_t); new_pending->proc = proc; @@ -517,7 +517,7 @@ ompi_osc_pt2pt_passive_lock(ompi_osc_pt2pt_module_t *module, module->p2p_shared_count++; send_ack = true; } else { - opal_output(0, "queuing lock request from %d (%d)", + opal_output(-1, "queuing lock request from %d (%d)", module->p2p_comm->c_my_rank, origin, lock_type); new_pending = OBJ_NEW(ompi_osc_pt2pt_pending_lock_t); new_pending->proc = proc; @@ -530,7 +530,7 @@ ompi_osc_pt2pt_passive_lock(ompi_osc_pt2pt_module_t *module, OPAL_THREAD_UNLOCK(&(module->p2p_lock)); if (send_ack) { - opal_output(0, "%d sending lock ack to %d", + opal_output(-1, "%d sending lock ack to %d", module->p2p_comm->c_my_rank, origin); ompi_osc_pt2pt_control_send(module, proc, OMPI_OSC_PT2PT_HDR_LOCK_REQ, @@ -573,7 +573,7 @@ ompi_osc_pt2pt_passive_unlock(ompi_osc_pt2pt_module_t *module, OPAL_THREAD_UNLOCK(&(module->p2p_lock)); if (NULL != new_pending) { - opal_output(0, "sending lock request to proc"); + opal_output(-1, "sending lock request to proc"); /* set lock state and generate a lock request */ module->p2p_lock_status = new_pending->lock_type; ompi_osc_pt2pt_control_send(module,