Exemple #1
0
// insert_vma_rb - insert vma in rb tree according vma->start_addr
static inline void
insert_vma_rb(rb_tree *tree, struct vma_struct *vma, struct vma_struct **vma_prevp) {
    rb_node *node = &(vma->rb_link), *prev;
    rb_insert(tree, node);
    if (vma_prevp != NULL) {
        prev = rb_node_prev(tree, node);
        *vma_prevp = (prev != NULL) ? rbn2vma(prev, rb_link) : NULL;
    }
}
Exemple #2
0
void vm_insert_vma(ProcVM *proc, ProcVMA *vma) {
  kassert(vma->vm_start < vma->vm_end);
  rb_insert(&(proc->mmap_root), &(vma->vm_link));
  
#if defined(__PCORE_NO_OPTIMIZE__)
  // Check overlap.
  RBNode *x = rb_search(&(proc->mmap_root), vma_key_compare, &(vma->vm_start));
  kassert(x != NULL);
  
  RBNode *y = rb_node_prev(&(proc->mmap_root), x);
  if (y != NULL) {
    vma_check_overlap(rbn2vma(y, vm_link), vma);
  }
  
  y = rb_node_next(&(proc->mmap_root), x);
  if (y != NULL) {
    vma_check_overlap(vma, rbn2vma(y, vm_link));
  }
#endif  // __PCORE_NO_OPTIMIZE__
  atomic_add(&(proc->map_count), 1);
}