LRESULT HaliteDialog::DialogListView::OnGetDispInfo(int, LPNMHDR pnmh, BOOL&) { hal::mutex_t::scoped_lock l(list_class_t::mutex_); NMLVDISPINFO* pdi = (NMLVDISPINFO*)pnmh; HAL_DEV_MSG(hal::wform(L"OnGetDispInfo index = %1% size = %2%") % pdi->item.iItem % peer_details_.size()); if (pdi->item.iItem >= 0 && peer_details_.size() >= numeric_cast<unsigned>(pdi->item.iItem)) { hal::peer_details_vec::optional_type pd = peer_details_.find_peer(key_from_index(pdi->item.iItem)); if (pd && pdi->item.mask & LVIF_TEXT) { wstring str = pd->to_wstring(pdi->item.iSubItem); size_t len = str.copy(pdi->item.pszText, min(pdi->item.cchTextMax - 1, static_cast<int>(str.size()))); pdi->item.pszText[len] = '\0'; } } return 0; }
/* Get the key af an item */ static nbr_table_key_t * key_from_item(nbr_table_t *table, const nbr_table_item_t *item) { return key_from_index(index_from_item(table, item)); }
/*---------------------------------------------------------------------------*/ static nbr_table_key_t * nbr_table_allocate(nbr_table_reason_t reason, void *data) { nbr_table_key_t *key; int least_used_count = 0; nbr_table_key_t *least_used_key = NULL; key = memb_alloc(&neighbor_addr_mem); if(key != NULL) { return key; } else { #ifdef NBR_TABLE_FIND_REMOVABLE const linkaddr_t *lladdr; lladdr = NBR_TABLE_FIND_REMOVABLE(reason, data); if(lladdr == NULL) { /* Nothing found that can be deleted - return NULL to indicate failure */ PRINTF("*** Not removing entry to allocate new\n"); return NULL; } else { /* used least_used_key to indicate what is the least useful entry */ int index; int locked = 0; if((index = index_from_lladdr(lladdr)) != -1) { least_used_key = key_from_index(index); locked = locked_map[index]; } /* Allow delete of locked item? */ if(least_used_key != NULL && locked) { PRINTF("Deleting locked item!\n"); locked_map[index] = 0; } } #endif /* NBR_TABLE_FIND_REMOVABLE */ if(least_used_key == NULL) { /* No more space, try to free a neighbor. * The replacement policy is the following: remove neighbor that is: * (1) not locked * (2) used by fewest tables * (3) oldest (the list is ordered by insertion time) * */ /* Get item from first key */ key = list_head(nbr_table_keys); while(key != NULL) { int item_index = index_from_key(key); int locked = locked_map[item_index]; /* Never delete a locked item */ if(!locked) { int used = used_map[item_index]; int used_count = 0; /* Count how many tables are using this item */ while(used != 0) { if((used & 1) == 1) { used_count++; } used >>= 1; } /* Find least used item */ if(least_used_key == NULL || used_count < least_used_count) { least_used_key = key; least_used_count = used_count; if(used_count == 0) { /* We won't find any least used item */ break; } } } key = list_item_next(key); } }