Exemple #1
0
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;
}
Exemple #2
0
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;
}
Exemple #4
0
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;
}