예제 #1
0
/**
 * Locate a registration cache entry which contains the given segment
 * completely.
 *
 * @param[in] rank  rank of the process
 * @param[in] buf   starting address of the buffer
 * @parma[in] len   length of the buffer
 *
 * @pre 0 <= rank && rank < reg_nprocs
 * @pre reg_cache_init() was previously called
 *
 * @return the reg cache entry, or NULL on failure
 */
reg_entry_t*
reg_cache_find(int rank, void *buf, size_t len)
{
    reg_entry_t *entry = NULL;
    reg_entry_t *runner = NULL;

    /* preconditions */
    assert(NULL != reg_cache);
    assert(0 <= rank && rank < reg_nprocs);

    runner = reg_cache[rank];

    while (runner && NULL == entry) {
        if (RR_SUCCESS == reg_entry_contains(runner, buf, len)) {
            entry = runner;
        }
        runner = runner->next;
    }

#ifndef NDEBUG
    /* we assert that the found entry was unique */
    while (runner) {
        if (RR_SUCCESS == reg_entry_contains(runner, buf, len)) {
            assert(0);
        }
        runner = runner->next;
    }
#endif

    return entry;
}
예제 #2
0
/**
 * Locate a registration window entry which contains the given segment
 * completely.
 *
 * @param[in] rank  rank of the process
 * @param[in] buf   starting address of the buffer
 * @parma[in] len   length of the buffer
 * 
 * @pre 0 <= rank && rank < reg_nprocs
 * @pre reg_win_init() was previously called
 *
 * @return the reg window entry, or NULL on failure
 */
reg_entry_t*
reg_win_find(int rank, void *buf, int len)
{
    reg_entry_t *entry = NULL;
    reg_entry_t *runner = NULL;

#ifdef TEST_DEBUG
    printf("[%d] reg_win_find(rank=%d, buf=%p, len=%d reg_win=%p)\n",
            reg_win_rank, rank, buf, len, reg_win);
#endif

    /* preconditions */
    COMEX_ASSERT(NULL != reg_win);
    COMEX_ASSERT(0 <= rank && rank < reg_nprocs);

    runner = reg_win[rank];

    while (runner && NULL == entry) {
#ifdef TEST_DEBUG
        printf("p[%d] searching on p[%d] runner rank: %d buf: %p len: %d\n",
            reg_win_rank,rank,
            runner->rank,runner->buf,runner->len);
#endif
        if (RR_SUCCESS == reg_entry_contains(runner, buf, len)) {
            entry = runner;
#ifdef TEST_DEBUG
            printf("[%d] reg_win_find entry found "
                    "reg_entry=%p buf=%p len=%d "
                    "runner: rank=%d buf=%p len=%d\n",
                    reg_win_rank, runner, buf, len,
                    runner->rank, runner->buf, runner->len);
#endif
        }
        runner = runner->next;
    }

#ifndef NDEBUG
    /* we COMEX_ASSERT that the found entry was unique */
    while (runner) {
        if (RR_SUCCESS == reg_entry_contains(runner, buf, len)) {
#ifdef TEST_DEBUG
            printf("[%d] reg_win_find duplicate found "
                    "reg_entry=%p buf=%p len=%d "
                    "rank=%d buf=%p len=%d\n",
                    reg_win_rank, runner, buf, len,
                    runner->rank, runner->buf, runner->len);
#endif
            COMEX_ASSERT(0);
        }
        runner = runner->next;
    }
#endif

    return entry;
}
예제 #3
0
/**
 * Locate a registration window entry which intersects the given segment.
 *
 * @param[in] rank  rank of the process
 * @param[in] buf   starting address of the buffer
 * @parma[in] len   length of the buffer
 * 
 * @pre 0 <= rank && rank < reg_nprocs
 * @pre reg_win_init() was previously called
 *
 * @return the reg window entry, or NULL on failure
 */
reg_entry_t*
reg_win_find_intersection(int rank, void *buf, int len)
{
    reg_entry_t *entry = NULL;
    reg_entry_t *runner = NULL;

#if DEBUG
    printf("[%d] reg_win_find_intersection(rank=%d, buf=%p, len=%d)\n",
            g_state.rank, rank, buf, len);
#endif

    /* preconditions */
    COMEX_ASSERT(NULL != reg_win);
    COMEX_ASSERT(0 <= rank && rank < reg_nprocs);

    runner = reg_win[rank];

    while (runner && NULL == entry) {
        if (RR_SUCCESS == reg_entry_intersects(runner, buf, len)) {
            entry = runner;
        }
        runner = runner->next;
    }

    /* we COMEX_ASSERT that the found entry was unique */
    while (runner) {
        if (RR_SUCCESS == reg_entry_contains(runner, buf, len)) {
            COMEX_ASSERT(0);
        }
        runner = runner->next;
    }

    return entry;
}