diff --git a/src/plugins/switch/elan/qsw.c b/src/plugins/switch/elan/qsw.c index 6f70db90d9ab9d54e4fa458523b9473292f860ac..efdad9f1c46a11f84d01231c28a4741ecff7c197 100644 --- a/src/plugins/switch/elan/qsw.c +++ b/src/plugins/switch/elan/qsw.c @@ -613,21 +613,21 @@ _alloc_hwcontext(bitstr_t *nodeset, uint32_t prognum, int num) uint16_t low_node = bit_ffs(nodeset); uint16_t high_node = bit_fls(nodeset); struct step_ctx *step_ctx_p; - bitstr_t *avail_context = bit_alloc(QSW_CTX_END - + bitstr_t *busy_context = bit_alloc(QSW_CTX_END - QSW_CTX_START + 1); - bit_nset(avail_context, 0, (QSW_CTX_END - QSW_CTX_START)); + assert(busy_context); _lock_qsw(); iter = list_iterator_create(qsw_internal_state->step_ctx_list); while ((step_ctx_p = list_next(iter))) { if ((high_node < step_ctx_p->st_low_node) || (low_node > step_ctx_p->st_high_node)) continue; - bit_nclear(avail_context, step_ctx_p->st_low, + bit_nset(busy_context, step_ctx_p->st_low, step_ctx_p->st_high); } list_iterator_destroy(iter); - bit = bit_nffs(avail_context, num); + bit = bit_nffc(busy_context, num); if (bit != -1) { step_ctx_p = xmalloc(sizeof(struct step_ctx)); step_ctx_p->st_prognum = prognum; @@ -640,6 +640,7 @@ _alloc_hwcontext(bitstr_t *nodeset, uint32_t prognum, int num) new = bit + QSW_CTX_START; } _unlock_qsw(); + bit_free(busy_context); } else { _srand_if_needed(); new = lrand48() %