void lof_storage::update_row(const string& row, const common::sfv_t& diff) { unordered_set<string> update_set; { common::sfv_t query; nn_engine_->decode_row(row, query); if (!query.empty()) { collect_neighbors(row, update_set); } } nn_engine_->update_row(row, diff); collect_neighbors(row, update_set); update_set.insert(row); update_entries(update_set); }
static int map_pages_at_vaddr(vspace_t *vspace, seL4_CPtr caps[], uintptr_t cookies[], void *vaddr, size_t num_pages, size_t size_bits, seL4_CapRights rights, int cacheable) { int error = seL4_NoError; for (int i = 0; i < num_pages && error == seL4_NoError; i++) { error = map_page(vspace, caps[i], vaddr, rights, cacheable, size_bits); if (error == seL4_NoError) { uintptr_t cookie = cookies == NULL ? 0 : cookies[i]; error = update_entries(vspace, (uintptr_t) vaddr, caps[i], size_bits, cookie); vaddr = (void *) ((uintptr_t) vaddr + (1 << size_bits)); } } return error; }
static int new_pages_at_vaddr(vspace_t *vspace, void *vaddr, size_t num_pages, size_t size_bits, seL4_CapRights rights, int cacheable) { sel4utils_alloc_data_t *data = get_alloc_data(vspace); int i; int error = seL4_NoError; void *start_vaddr = vaddr; for (i = 0; i < num_pages; i++) { vka_object_t object; if (vka_alloc_frame(data->vka, size_bits, &object) != 0) { /* abort! */ ZF_LOGE("Failed to allocate page"); error = seL4_NotEnoughMemory; break; } error = map_page(vspace, object.cptr, vaddr, rights, cacheable, size_bits); if (error == seL4_NoError) { error = update_entries(vspace, (uintptr_t) vaddr, object.cptr, size_bits, object.ut); vaddr = (void *) ((uintptr_t) vaddr + (1 << size_bits)); } else { vka_free_object(data->vka, &object); break; } } if (i < num_pages) { /* we failed, clean up successfully allocated pages */ sel4utils_unmap_pages(vspace, start_vaddr, i, size_bits, data->vka); } return error; }