error_t pager_read_page (struct user_pager_info *pager, vm_offset_t page, vm_address_t *buf, int *write_lock) { int pfn = page / vm_page_size; size_t nread; /* We never request write locks. */ *write_lock = 0; expand_map (pager, page); if (!pager->map[pfn]) vm_allocate (mach_task_self (), buf, vm_page_size, 1); else { store_read (backing_store, pager->map[pfn], vm_page_size, (void **)buf, &nread); if (nread != vm_page_size) { munmap ((caddr_t) *buf, nread); return EIO; } } return 0; }
handleid handlemap_new(struct handlemap *m, void *ud) { int i; if (ud == NULL) return 0; rwlock_wlock(&m->lock); if (m->n >= m->cap * 3 / 4) { if (expand_map(m) == NULL) { // memory overflow rwlock_wunlock(&m->lock); return 0; } } for (i=0;;i++) { struct handleslot *slot; handleid id = ++m->lastid; if (id == 0) { // 0 is reserved for invalid id id = ++m->lastid; } slot = &m->slot[id & (m->cap - 1)]; if (slot->id) continue; slot->id = id; slot->ref = 1; slot->ud = ud; ++m->n; rwlock_wunlock(&m->lock); return id; } }
void expand_map(QStringList & keys, const QString & k, const QVariant & v){ if(v.type() == QVariant::Map){ const QVariantMap & map = asMap(v); for(QVariantMap::const_iterator it = map.begin(); it != map.end(); ++it){ expand_map(keys, k.isEmpty() ? it.key() : k +"." + it.key(), it.value()); } } if(!k.isEmpty()){ keys.append(k); } }
error_t pager_write_page (struct user_pager_info *pager, vm_offset_t page, vm_address_t buf) { int pfn = page / vm_page_size; size_t nwritten; expand_map (pager, page); if (!pager->map[pfn]) pager->map[pfn] = allocate_backing_page (); /* No more backing store. Oh dear. */ if (!pager->map[pfn]) return EIO; err = store_write (backing_store, pager->map[pfn], (void *) buf, vm_page_size, &nwritten); if (!err && nwritten != vm_page_size) err = EIO; return err; }
QStringList ICISettings::keys() const { QStringList lst; expand_map(lst, QString(), values()); return lst; }