Advertisement
Guest User

BeTreeAllocationIssuePatch

a guest
Nov 8th, 2018
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 5.54 KB | None | 0 0
  1. diff --git a/src/PagedDataStructures/betree.jl b/src/PagedDataStructures/betree.jl
  2. index a5668002..098bfdae 100644
  3. --- a/src/PagedDataStructures/betree.jl
  4. +++ b/src/PagedDataStructures/betree.jl
  5. @@ -7,6 +7,7 @@ using ..Common
  6.  using Blobs
  7.  import Suppressor: @suppress
  8.  using Nullables: Nullable, isnull
  9. +using StaticArrays
  10.  
  11.  const PMAImpl = NaivePackedMemoryArray
  12.  const FOUND_ELEMENT = true
  13. @@ -319,7 +320,7 @@ end
  14.  #######################################
  15.  # Iterator interface for Internal Nodes
  16.  #######################################
  17. -mutable struct BeInternalNodeIteratorState
  18. +struct BeInternalNodeIteratorState
  19.      index::Int
  20.      done::Bool
  21.  end
  22. @@ -345,21 +346,14 @@ end
  23.  end
  24.  
  25.  @inline function pds_next(node::Blob{BeInternalNode{K,V,E}}, state) where {K,V,E}
  26. -    (mutable_next(node, state), state)
  27. -end
  28. -
  29. -@inline function mutable_next(node::Blob{BeInternalNode{K,V,E}}, state) where {K,V,E}
  30.      @dassert1 !pds_done(node, state)
  31.  
  32.      if !pds_done(node.pivots[], state.index)
  33.          ((k,v), index) = pds_next(node.pivots[], state.index)
  34. -        state.index = index
  35.          @dassert1 !state.done
  36. -        (Nullable{K}(k) => v)
  37. +        (Nullable{K}(k) => v, BeInternalNodeIteratorState(index, false))
  38.      else
  39. -        state.index = 0
  40. -        state.done = true
  41. -        (Nullable{K}() => getrightmost(node))
  42. +        (Nullable{K}() => getrightmost(node), BeInternalNodeIteratorState(0, true))
  43.      end
  44.  end
  45.  
  46. @@ -783,8 +777,7 @@ end
  47.  #######################################
  48.  # Iterator interface for BeTree with epsilon equal to 1.0
  49.  #######################################
  50. -mutable struct BIteratorStackFrame{K,V}
  51. -    page::Pager.PagePtr
  52. +struct BIteratorStackFrame{K,V}
  53.      node::Blob{BeInternalNode{K,V,1.0}}
  54.      state::BeInternalNodeIteratorState
  55.  end
  56. @@ -794,15 +787,41 @@ const BInternalNode{K,V} = BeInternalNode{K,V,1.0}
  57.  
  58.  const BeLeafNodeIteratorState = Int64
  59.  
  60. -mutable struct BIteratorState{K,V}
  61. -    pager::Transaction
  62. -    stack::SStack{BIteratorStackFrame{K,V}}
  63. -    lpage::Pager.PagePtr
  64. -    lnode::Blob{BLeafNode{K,V}}
  65. -    lstate::BeLeafNodeIteratorState
  66. -    done::Bool
  67. -
  68. -    BIteratorState{K,V}(pager::Transaction) where {K,V} = new{K,V}(pager, SStack{BIteratorStackFrame{K,V}}())
  69. +eval(quote
  70. +    mutable struct BIteratorState{K,V} <: FieldVector{SSTACK_INIT_SIZE, BIteratorStackFrame{K,V}}
  71. +        $([:($(Symbol("_$i"))::BIteratorStackFrame{K,V}) for i=1:SSTACK_INIT_SIZE]...)
  72. +        len::Int64
  73. +        pager::Transaction
  74. +        lnode::Blob{BLeafNode{K,V}}
  75. +        lstate::BeLeafNodeIteratorState
  76. +        done::Bool
  77. +
  78. +        function BIteratorState{K,V}(pager::Transaction) where {K,V}
  79. +            inst = new{K,V}()
  80. +            inst.len = 0
  81. +            inst.pager = pager
  82. +            inst
  83. +        end
  84. +    end
  85. +end)
  86. +Base.isempty(s::BIteratorState) = s.len == 0
  87. +Base.length(s::BIteratorState) = s.len
  88. +Base.size(s::BIteratorState) = (s.len,)
  89. +function Base.push!(s::BIteratorState, x)
  90. +    s.len += 1
  91. +    SSTACK_INIT_SIZE < s.len && throw(ArgumentError("BIteratorState's stack is full"))
  92. +    s[s.len] = x
  93. +    nothing
  94. +end
  95. +function DataStructures.top(s::BIteratorState{K,V}) where {K,V}
  96. +    isempty(s) && throw(ArgumentError("BIteratorState's stack must be non-empty"))
  97. +    s[s.len]::BIteratorStackFrame{K,V}
  98. +end
  99. +function Base.pop!(s::BIteratorState{K,V}) where {K,V}
  100. +    isempty(s) && throw(ArgumentError("BIteratorState's stack must be non-empty"))
  101. +    top::BIteratorStackFrame{K,V} = s[s.len]
  102. +    s.len -= 1
  103. +    top
  104.  end
  105.  
  106.  function mark_as_done(state::BIteratorState{K,V}) where {K,V}
  107. @@ -812,18 +831,17 @@ end
  108.  
  109.  function complement_btree_iterator_state_for_next(tree::BTree{K,V}, pid, biter_state::BIteratorState{K,V}) where {K,V}
  110.      t = tree.state
  111. -    while length(biter_state.stack) < t.height[]-1
  112. +    while length(biter_state#=.stack=#) < t.height[]-1
  113.          (page, node) = get_paged_obj(biter_state.pager, BInternalNode{K,V}, pid)
  114.          state = pds_start(node)
  115.          @dassert1 !pds_done(node, state)
  116. -        (_, pid) = mutable_next(node, state)
  117. -        push!(biter_state.stack, BIteratorStackFrame{K,V}(page, node, state))
  118. +        ((_, pid), state) = pds_next(node, state)
  119. +        push!(biter_state#=.stack=#, BIteratorStackFrame{K,V}(node, state))
  120.      end
  121.  
  122.      (lpage, lnode) = get_paged_obj(biter_state.pager, BLeafNode{K,V}, pid)
  123.      lstate = pds_start(lnode)
  124.  
  125. -    biter_state.lpage = lpage
  126.      biter_state.lnode = lnode
  127.      biter_state.lstate = lstate
  128.      biter_state.done = pds_done(lnode, lstate)
  129. @@ -848,15 +866,17 @@ end
  130.  function nextleaf(tree::BTree{K,V}, state::BIteratorState{K,V}) where {K,V}
  131.      t = tree.state
  132.      height = t.height[]
  133. -    @dassert1 height-1 == length(state.stack)
  134. +    @dassert1 height-1 == length(state#=.stack=#)
  135.  
  136. -    while !isempty(state.stack)
  137. -        frame = DataStructures.top(state.stack)
  138. +    while !isempty(state#=.stack=#)
  139. +        frame = pop!(state#=.stack=#)
  140.          if !pds_done(frame.node, frame.state)
  141. -            (_, pid) = mutable_next(frame.node, frame.state)
  142. -            return complement_btree_iterator_state_for_next(tree, pid, state)
  143. +            # InteractiveUtils.@code_warntype pds_next(frame.node, frame.state)
  144. +            ((_, pid), new_state) = pds_next(frame.node, frame.state)
  145. +            push!(state#=.stack=#, BIteratorStackFrame{K,V}(frame.node, new_state))
  146. +            complement_btree_iterator_state_for_next(tree, pid, state)
  147. +            return nothing
  148.          end
  149. -        pop!(state.stack)
  150.      end
  151.  
  152.      mark_as_done(state)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement