diff --git a/ompi/mca/osc/sm/osc_sm_passive_target.c b/ompi/mca/osc/sm/osc_sm_passive_target.c index b2398ed32e..ffe93fdb5d 100644 --- a/ompi/mca/osc/sm/osc_sm_passive_target.c +++ b/ompi/mca/osc/sm/osc_sm_passive_target.c @@ -151,18 +151,34 @@ ompi_osc_sm_unlock(int target, /* ensure all memory operations have completed */ opal_atomic_mb(); - if (lock_none == module->outstanding_locks[target]) { + switch (module->outstanding_locks[target]) { + case lock_none: return OMPI_ERR_RMA_SYNC; - } - if (module->outstanding_locks[target] == lock_nocheck) { + case lock_nocheck: ret = OMPI_SUCCESS; - } else if (module->outstanding_locks[target] == lock_exclusive) { + break; + + case lock_exclusive: ret = end_exclusive(module, target); - } else if (module->outstanding_locks[target] == lock_shared) { + break; + + case lock_shared: ret = end_shared(module, target); - } else { - ret = OMPI_SUCCESS; + break; + + default: + // This is an OMPI programming error -- cause some pain. + assert(module->outstanding_locks[target] == lock_none || + module->outstanding_locks[target] == lock_nocheck || + module->outstanding_locks[target] == lock_exclusive || + module->outstanding_locks[target] == lock_shared); + + // In non-developer builds, assert() will be a no-op, so + // ensure the error gets reported + opal_output(0, "Unknown lock type in ompi_osc_sm_unlock -- this is an OMPI programming error"); + ret = OMPI_ERR_BAD_PARAM; + break; } module->outstanding_locks[target] = lock_none;