static int ompi_mtl_portals4_recv_block_progress(ptl_event_t *ev, ompi_mtl_portals4_base_request_t* ptl_base_request) { ompi_mtl_portals4_recv_short_request_t *ptl_request = (ompi_mtl_portals4_recv_short_request_t*) ptl_base_request; ompi_mtl_portals4_recv_short_block_t *block = ptl_request->block; if (PTL_EVENT_AUTO_FREE == ev->type) { if (OPAL_UNLIKELY(block->release_on_free)) { opal_list_remove_item(&ompi_mtl_portals4.waiting_recv_short_blocks, &block->base); ompi_mtl_portals4_recv_short_block_free(block); } else { ompi_mtl_portals4_activate_block(block); } } else if (PTL_EVENT_AUTO_UNLINK == ev->type) { opal_list_remove_item(&ompi_mtl_portals4.active_recv_short_blocks, &block->base); opal_list_append(&ompi_mtl_portals4.waiting_recv_short_blocks, &block->base); } else { OPAL_OUTPUT_VERBOSE((50, ompi_mtl_base_framework.framework_output, "OVERFLOW EVENT %d, hdr_data = %lx", ev->type, (long unsigned) ev->hdr_data)); } return OMPI_SUCCESS; }
int ompi_mtl_portals4_recv_short_fini(void) { opal_list_item_t *item; while (NULL != (item = opal_list_remove_first(&ompi_mtl_portals4.active_recv_short_blocks))) { ompi_mtl_portals4_recv_short_block_t *block = (ompi_mtl_portals4_recv_short_block_t*) item; ompi_mtl_portals4_recv_short_block_free(block); } while (NULL != (item = opal_list_remove_first(&ompi_mtl_portals4.waiting_recv_short_blocks))) { ompi_mtl_portals4_recv_short_block_t *block = (ompi_mtl_portals4_recv_short_block_t*) item; ompi_mtl_portals4_recv_short_block_free(block); } return OMPI_SUCCESS; }
int ompi_mtl_portals4_recv_short_fini(void) { opal_list_item_t *item; OPAL_THREAD_LOCK(&ompi_mtl_portals4.short_block_mutex); while (NULL != (item = opal_list_remove_first(&ompi_mtl_portals4.recv_short_blocks))) { ompi_mtl_portals4_recv_short_block_t *block = (ompi_mtl_portals4_recv_short_block_t*) item; ompi_mtl_portals4_recv_short_block_free(block); } OPAL_THREAD_UNLOCK(&ompi_mtl_portals4.short_block_mutex); return OMPI_SUCCESS; }
static int ompi_mtl_portals4_recv_block_progress(ptl_event_t *ev, ompi_mtl_portals4_base_request_t* ptl_base_request) { int ret = OMPI_SUCCESS; ompi_mtl_portals4_recv_short_request_t *ptl_request = (ompi_mtl_portals4_recv_short_request_t*) ptl_base_request; ompi_mtl_portals4_recv_short_block_t *block = ptl_request->block; switch (ev->type) { case PTL_EVENT_AUTO_FREE: #if OMPI_ENABLE_THREAD_MULTIPLE OPAL_THREAD_LOCK(&ompi_mtl_portals4.short_block_mutex); switch (block->status) { case BLOCK_STATUS_ACTIVATED: /* May be encountered with multi threading */ block->status = BLOCK_STATUS_WAITING_UNLINK; ompi_mtl_portals4.active_recv_short_blocks--; OPAL_THREAD_UNLOCK(&ompi_mtl_portals4.short_block_mutex); OPAL_OUTPUT_VERBOSE((10, ompi_mtl_base_framework.framework_output, "mtl:portals4 PTL_EVENT_AUTO_FREE received before PTL_EVENT_AUTO_UNLINK")); break; case BLOCK_STATUS_WAITING_FREE: /* Normal case */ if (OPAL_UNLIKELY(block->release_on_free)) { opal_list_remove_item(&ompi_mtl_portals4.recv_short_blocks, &block->base); OPAL_THREAD_UNLOCK(&ompi_mtl_portals4.short_block_mutex); ret = ompi_mtl_portals4_recv_short_block_free(block); } else { OPAL_THREAD_UNLOCK(&ompi_mtl_portals4.short_block_mutex); ret = ompi_mtl_portals4_activate_block(block); } break; default: OPAL_THREAD_UNLOCK(&ompi_mtl_portals4.short_block_mutex); opal_output_verbose(1, ompi_mtl_base_framework.framework_output, "%s:%d: Bad status (%d) when receiving PTL_EVENT_AUTO_FREE", __FILE__, __LINE__, block->status); break; } #else if (OPAL_UNLIKELY(block->release_on_free)) { opal_list_remove_item(&ompi_mtl_portals4.recv_short_blocks, &block->base); ompi_mtl_portals4_recv_short_block_free(block); } else { ompi_mtl_portals4_activate_block(block); } #endif break; case PTL_EVENT_AUTO_UNLINK: block->me_h = PTL_INVALID_HANDLE; #if OMPI_ENABLE_THREAD_MULTIPLE OPAL_THREAD_LOCK(&ompi_mtl_portals4.short_block_mutex); switch (block->status) { case BLOCK_STATUS_ACTIVATED: /* Normal case */ block->status = BLOCK_STATUS_WAITING_FREE; ompi_mtl_portals4.active_recv_short_blocks--; OPAL_THREAD_UNLOCK(&ompi_mtl_portals4.short_block_mutex); break; case BLOCK_STATUS_WAITING_UNLINK: /* May be encountered with multi threading */ if (OPAL_UNLIKELY(block->release_on_free)) { opal_list_remove_item(&ompi_mtl_portals4.recv_short_blocks, &block->base); OPAL_THREAD_UNLOCK(&ompi_mtl_portals4.short_block_mutex); ret = ompi_mtl_portals4_recv_short_block_free(block); } else { OPAL_THREAD_UNLOCK(&ompi_mtl_portals4.short_block_mutex); OPAL_OUTPUT_VERBOSE((10, ompi_mtl_base_framework.framework_output, "mtl:portals4 PTL_EVENT_AUTO_UNLINK received after PTL_EVENT_AUTO_FREE")); ret = ompi_mtl_portals4_activate_block(block); } break; default: OPAL_THREAD_UNLOCK(&ompi_mtl_portals4.short_block_mutex); opal_output_verbose(1, ompi_mtl_base_framework.framework_output, "%s:%d: Bad status (%d) when receiving PTL_EVENT_AUTO_UNLINK", __FILE__, __LINE__, block->status); break; } #else block->status = BLOCK_STATUS_WAITING_FREE; ompi_mtl_portals4.active_recv_short_blocks--; #endif break; case PTL_EVENT_LINK: #if OMPI_ENABLE_THREAD_MULTIPLE OPAL_THREAD_LOCK(&ompi_mtl_portals4.short_block_mutex); switch (block->status) { case BLOCK_STATUS_WAITING_LINK: block->status = BLOCK_STATUS_ACTIVATED; ompi_mtl_portals4.active_recv_short_blocks++; OPAL_THREAD_UNLOCK(&ompi_mtl_portals4.short_block_mutex); break; default: OPAL_THREAD_UNLOCK(&ompi_mtl_portals4.short_block_mutex); opal_output_verbose(1, ompi_mtl_base_framework.framework_output, "%s:%d: Bad status (%d) when receiving PTL_EVENT_LINK", __FILE__, __LINE__, block->status); break; } #else block->status = BLOCK_STATUS_ACTIVATED; ompi_mtl_portals4.active_recv_short_blocks++; #endif break; default: OPAL_OUTPUT_VERBOSE((50, ompi_mtl_base_framework.framework_output, "Other EVENT %d, hdr_data = %lx", ev->type, (long unsigned) ev->hdr_data)); break; } return ret; }