zoukankan      html  css  js  c++  java
  • interval tree

    interval tree

    interval tree中可以插入完全相同的node,此后interval tree中将会有此两个相同的node

    往interval tree中插入两个相同的node后,再根据node的值到interval tree中去搜索,结果是可以找到这两个相同的node,这两个node的rb_subtree_last的值不同,其中第一个搜索出来的node的rb_subtree_last的值是0x20f,这个是根据此node(anon_avc_chain)本身算出来的;而第二个搜索出来的node的rb_subtree_last的值不是由它本身计算出来的,这个0xb0f是此棵interval tree最大的rb_subtree_last值:

    [ 98.655755] cnt:1: avc->rb_subtree_last: 0x20f, avc->vma->vm_start/vm_end: 0x200000, 0x210000.
    [ 98.677732] cnt:2: avc->rb_subtree_last: 0xb0f, avc->vma->vm_start/vm_end: 0x200000, 0x210000.

    void interval_tree_test_func(void)
    {
    
    int i;
    
    int cnt = 0;
    
    pgoff_t pgoff_start, pgoff_end;
    
    struct rb_root_cached rb_root;
    
    struct anon_vma_chain *avcs;
    
    struct vm_area_struct *vmas;
    
    struct anon_vma anon_vma;
    
    struct anon_vma_chain *avc;
    
    pgoff_start = pgoff_end = 0x200000 >> PAGE_SHIFT;
    
    anon_vma.rb_root = RB_ROOT_CACHED;
    
    avcs = (struct anon_vma_chain *)kmalloc(sizeof(struct anon_vma_chain)*12, GFP_KERNEL);
    
    if(avcs == NULL)
    
    {
    
    pr_err("alloc avcs failed.\n");
    
    return;
    
    }
    
    vmas = (struct vm_area_struct *)kmalloc(sizeof(struct vm_area_struct)*12, GFP_KERNEL);
    
    if(vmas == NULL)
    
    {
    
    pr_err("alloc vmas failed.\n");
    
    return;
    
    }
    
    for(i = 0; i < 12; i++)
    
    {
    
    vmas[i].vm_start = i*0x100000;
    
    vmas[i].vm_end = vmas[i].vm_start + 16*PAGE_SIZE;
    
    vmas[i].vm_pgoff = vmas[i].vm_start>>PAGE_SHIFT;
    
    }
    
    vmas[3].vm_start = vmas[2].vm_start;
    
    vmas[3].vm_end = vmas[2].vm_end;
    
    vmas[3].vm_pgoff = vmas[2].vm_pgoff;
    
    for(i = 0; i<12; i++)
    
    {
    
    avcs[i].anon_vma = &anon_vma;
    
    avcs[i].vma = &vmas[i];
    
    anon_vma_interval_tree_insert(&avcs[i], &anon_vma.rb_root);
    
    }
    
    anon_vma_interval_tree_foreach(avc,&anon_vma.rb_root,pgoff_start,pgoff_end)
    
    {
    
    pr_info("cnt:%d: avc->rb_subtree_last: %#lx, avc->vma->vm_start/vm_end: %#lx, %#lx.\n", ++cnt, avc->rb_subtree_last, avc->vma->vm_start, avc->vma->vm_end);
    
    }
    
    kfree(avcs);
    
    kfree(vmas);
    
    }
  • 相关阅读:
    HDU 2878 Great World of Goo
    HDU 4295 4 substrings problem
    UVALive 4975 Casting Spells
    UVA 10572 Black & White
    POJ 3133 Manhattan Wiring
    HDU 4267 A Simple Problem with Integers
    SPOJ 7258 Lexicographical Substring Search
    UVALive 4978 Fields and Farmers
    ssh连接aix问题与解决
    MDRT_<>$表
  • 原文地址:https://www.cnblogs.com/aspirs/p/15800829.html
Copyright © 2011-2022 走看看