/** * 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; }
/** * 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; }
/** * 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; }