€•Œsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ(/translations/zh_CN/core-api/assoc_array”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/zh_TW/core-api/assoc_array”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/it_IT/core-api/assoc_array”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/ja_JP/core-api/assoc_array”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/ko_KR/core-api/assoc_array”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/pt_BR/core-api/assoc_array”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/sp_SP/core-api/assoc_array”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒ(Generic Associative Array Implementation”h]”hŒ(Generic Associative Array Implementation”…”�”}”(hh¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhh·h²hh³ŒB/var/lib/git/docbuild/linux/Documentation/core-api/assoc_array.rst”h´Kubh¶)�”}”(hhh]”(h»)�”}”(hŒOverview”h]”hŒOverview”…”�”}”(hhÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhhËh²hh³hÊh´KubhŒ paragraph”“”)�”}”(hŒ[This associative array implementation is an object container with the following properties:”h]”hŒ[This associative array implementation is an object container with the following properties:”…”�”}”(hhÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KhhËh²hubhŒenumerated_list”“”)�”}”(hhh]”(hŒ list_item”“”)�”}”(hŒÓObjects are opaque pointers. The implementation does not care where they point (if anywhere) or what they point to (if anything). .. note:: Pointers to objects _must_ be zero in the least significant bit. ”h]”(hÝ)�”}”(hŒ‚Objects are opaque pointers. The implementation does not care where they point (if anywhere) or what they point to (if anything).”h]”hŒ‚Objects are opaque pointers. The implementation does not care where they point (if anywhere) or what they point to (if anything).”…”�”}”(hh÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K hhóubhŒnote”“”)�”}”(hŒ@Pointers to objects _must_ be zero in the least significant bit.”h]”hÝ)�”}”(hj h]”hŒ@Pointers to objects _must_ be zero in the least significant bit.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhhóubeh}”(h]”h ]”h"]”h$]”h&]”uh1hñhhîh²hh³Nh´Nubhò)�”}”(hŒÔObjects do not need to contain linkage blocks for use by the array. This permits an object to be located in multiple arrays simultaneously. Rather, the array is made up of metadata blocks that point to objects. ”h]”hÝ)�”}”(hŒÓObjects do not need to contain linkage blocks for use by the array. This permits an object to be located in multiple arrays simultaneously. Rather, the array is made up of metadata blocks that point to objects.”h]”hŒÓObjects do not need to contain linkage blocks for use by the array. This permits an object to be located in multiple arrays simultaneously. Rather, the array is made up of metadata blocks that point to objects.”…”�”}”(hj(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Khj$ubah}”(h]”h ]”h"]”h$]”h&]”uh1hñhhîh²hh³hÊh´Nubhò)�”}”(hŒ``. The associative array is rooted on the following structure::”h]”(hŒThe public API can be found in ”…”�”}”(hjFh²hh³Nh´NubhŒliteral”“”)�”}”(hŒ````”h]”hŒ”…”�”}”(hjPh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jNhjFubhŒ>. The associative array is rooted on the following structure:”…”�”}”(hjFh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K;hj5h²hubhŒ literal_block”“”)�”}”(hŒ#struct assoc_array { ... };”h]”hŒ#struct assoc_array { ... };”…”�”}”hjjsbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1jhh³hÊh´K>hj5h²hubhÝ)�”}”(hŒDThe code is selected by enabling ``CONFIG_ASSOCIATIVE_ARRAY`` with::”h]”(hŒ!The code is selected by enabling ”…”�”}”(hjzh²hh³Nh´NubjO)�”}”(hŒ``CONFIG_ASSOCIATIVE_ARRAY``”h]”hŒCONFIG_ASSOCIATIVE_ARRAY”…”�”}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jNhjzubhŒ with:”…”�”}”(hjzh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KBhj5h²hubji)�”}”(hŒ$./script/config -e ASSOCIATIVE_ARRAY”h]”hŒ$./script/config -e ASSOCIATIVE_ARRAY”…”�”}”hjšsbah}”(h]”h ]”h"]”h$]”h&]”jxjyuh1jhh³hÊh´KDhj5h²hubh¶)�”}”(hhh]”(h»)�”}”(hŒ Edit Script”h]”hŒ Edit Script”…”�”}”(hj«h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj¨h²hh³hÊh´KHubhÝ)�”}”(hXIThe insertion and deletion functions produce an 'edit script' that can later be applied to effect the changes without risking ``ENOMEM``. This retains the preallocated metadata blocks that will be installed in the internal tree and keeps track of the metadata blocks that will be removed from the tree when the script is applied.”h]”(hŒ‚The insertion and deletion functions produce an ‘edit script’ that can later be applied to effect the changes without risking ”…”�”}”(hj¹h²hh³Nh´NubjO)�”}”(hŒ ``ENOMEM``”h]”hŒENOMEM”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jNhj¹ubhŒÁ. This retains the preallocated metadata blocks that will be installed in the internal tree and keeps track of the metadata blocks that will be removed from the tree when the script is applied.”…”�”}”(hj¹h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KJhj¨h²hubhÝ)�”}”(hXThis is also used to keep track of dead blocks and dead objects after the script has been applied so that they can be freed later. The freeing is done after an RCU grace period has passed - thus allowing access functions to proceed under the RCU read lock.”h]”hXThis is also used to keep track of dead blocks and dead objects after the script has been applied so that they can be freed later. The freeing is done after an RCU grace period has passed - thus allowing access functions to proceed under the RCU read lock.”…”�”}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KPhj¨h²hubhÝ)�”}”(hŒCThe script appears as outside of the API as a pointer of the type::”h]”hŒBThe script appears as outside of the API as a pointer of the type:”…”�”}”(hjçh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KUhj¨h²hubji)�”}”(hŒstruct assoc_array_edit;”h]”hŒstruct assoc_array_edit;”…”�”}”hjõsbah}”(h]”h ]”h"]”h$]”h&]”jxjyuh1jhh³hÊh´KWhj¨h²hubhÝ)�”}”(hŒ4There are two functions for dealing with the script:”h]”hŒ4There are two functions for dealing with the script:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KYhj¨h²hubhí)�”}”(hhh]”(hò)�”}”(hX<Apply an edit script:: void assoc_array_apply_edit(struct assoc_array_edit *edit); This will perform the edit functions, interpolating various write barriers to permit accesses under the RCU read lock to continue. The edit script will then be passed to ``call_rcu()`` to free it and any dead stuff it points to. ”h]”(hÝ)�”}”(hŒApply an edit script::”h]”hŒApply an edit script:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K[hjubji)�”}”(hŒ;void assoc_array_apply_edit(struct assoc_array_edit *edit);”h]”hŒ;void assoc_array_apply_edit(struct assoc_array_edit *edit);”…”�”}”hj&sbah}”(h]”h ]”h"]”h$]”h&]”jxjyuh1jhh³hÊh´K]hjubhÝ)�”}”(hŒåThis will perform the edit functions, interpolating various write barriers to permit accesses under the RCU read lock to continue. The edit script will then be passed to ``call_rcu()`` to free it and any dead stuff it points to.”h]”(hŒ«This will perform the edit functions, interpolating various write barriers to permit accesses under the RCU read lock to continue. The edit script will then be passed to ”…”�”}”(hj4h²hh³Nh´NubjO)�”}”(hŒ``call_rcu()``”h]”hŒ call_rcu()”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jNhj4ubhŒ, to free it and any dead stuff it points to.”…”�”}”(hj4h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K_hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1hñhjh²hh³hÊh´Nubhò)�”}”(hXCancel an edit script:: void assoc_array_cancel_edit(struct assoc_array_edit *edit); This frees the edit script and all preallocated memory immediately. If this was for insertion, the new object is *not* released by this function, but must rather be released by the caller. ”h]”(hÝ)�”}”(hŒCancel an edit script::”h]”hŒCancel an edit script:”…”�”}”(hj^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KdhjZubji)�”}”(hŒh²hh³Nh´NubjO)�”}”(hŒ ``-ENOMEM``”h]”hŒ-ENOMEM”…”�”}”(hjFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jNhj>ubhŒ3 is returned in the case of an out-of-memory error.”…”�”}”(hj>h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÃhjâubhÝ)�”}”(hŒHThe caller should lock exclusively against other modifiers of the array.”h]”hŒHThe caller should lock exclusively against other modifiers of the array.”…”�”}”(hj^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÇhjâubeh}”(h]”h ]”h"]”h$]”h&]”uh1hñhj«h²hh³hÊh´Nubhò)�”}”(hX§Delete an object from an associative array:: struct assoc_array_edit * assoc_array_delete(struct assoc_array *array, const struct assoc_array_ops *ops, const void *index_key); This deletes an object that matches the specified data from the array. The ``index_key`` argument should hold index key information and is passed to the methods in the ops table when they are called. This function makes no alteration to the array itself, but rather returns an edit script that must be applied. ``-ENOMEM`` is returned in the case of an out-of-memory error. ``NULL`` will be returned if the specified object is not found within the array. ”h]”(hÝ)�”}”(hŒ,Delete an object from an associative array::”h]”hŒ+Delete an object from an associative array:”…”�”}”(hjvh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÊhjrubji)�”}”(hŒ¨struct assoc_array_edit * assoc_array_delete(struct assoc_array *array, const struct assoc_array_ops *ops, const void *index_key);”h]”hŒ¨struct assoc_array_edit * assoc_array_delete(struct assoc_array *array, const struct assoc_array_ops *ops, const void *index_key);”…”�”}”hj„sbah}”(h]”h ]”h"]”h$]”h&]”jxjyuh1jhh³hÊh´KÌhjrubhÝ)�”}”(hŒFThis deletes an object that matches the specified data from the array.”h]”hŒFThis deletes an object that matches the specified data from the array.”…”�”}”(hj’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÑhjrubhÝ)�”}”(hŒ€The ``index_key`` argument should hold index key information and is passed to the methods in the ops table when they are called.”h]”(hŒThe ”…”�”}”(hj h²hh³Nh´NubjO)�”}”(hŒ ``index_key``”h]”hŒ index_key”…”�”}”(hj¨h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jNhj ubhŒo argument should hold index key information and is passed to the methods in the ops table when they are called.”…”�”}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÓhjrubhÝ)�”}”(hXThis function makes no alteration to the array itself, but rather returns an edit script that must be applied. ``-ENOMEM`` is returned in the case of an out-of-memory error. ``NULL`` will be returned if the specified object is not found within the array.”h]”(hŒpThis function makes no alteration to the array itself, but rather returns an edit script that must be applied. ”…”�”}”(hjÀh²hh³Nh´NubjO)�”}”(hŒ ``-ENOMEM``”h]”hŒ-ENOMEM”…”�”}”(hjÈh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jNhjÀubhŒ5 is returned in the case of an out-of-memory error. ”…”�”}”(hjÀh²hh³Nh´NubjO)�”}”(hŒ``NULL``”h]”hŒNULL”…”�”}”(hjÚh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jNhjÀubhŒH will be returned if the specified object is not found within the array.”…”�”}”(hjÀh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÖhjrubeh}”(h]”h ]”h"]”h$]”h&]”uh1hñhj«h²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jjjhjjuh1hìhjŒh²hh³hÊh´KªubhÝ)�”}”(hŒHThe caller should lock exclusively against other modifiers of the array.”h]”hŒHThe caller should lock exclusively against other modifiers of the array.”…”�”}”(hjþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÛhjŒh²hubhí)�”}”(hhh]”(hò)�”}”(hXDelete all objects from an associative array:: struct assoc_array_edit * assoc_array_clear(struct assoc_array *array, const struct assoc_array_ops *ops); This deletes all the objects from an associative array and leaves it completely empty. This function makes no alteration to the array itself, but rather returns an edit script that must be applied. ``-ENOMEM`` is returned in the case of an out-of-memory error. The caller should lock exclusively against other modifiers of the array. ”h]”(hÝ)�”}”(hŒ.Delete all objects from an associative array::”h]”hŒ-Delete all objects from an associative array:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÞhjubji)�”}”(hŒ|struct assoc_array_edit * assoc_array_clear(struct assoc_array *array, const struct assoc_array_ops *ops);”h]”hŒ|struct assoc_array_edit * assoc_array_clear(struct assoc_array *array, const struct assoc_array_ops *ops);”…”�”}”hj!sbah}”(h]”h ]”h"]”h$]”h&]”jxjyuh1jhh³hÊh´KàhjubhÝ)�”}”(hŒVThis deletes all the objects from an associative array and leaves it completely empty.”h]”hŒVThis deletes all the objects from an associative array and leaves it completely empty.”…”�”}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KähjubhÝ)�”}”(hŒ®This function makes no alteration to the array itself, but rather returns an edit script that must be applied. ``-ENOMEM`` is returned in the case of an out-of-memory error.”h]”(hŒpThis function makes no alteration to the array itself, but rather returns an edit script that must be applied. ”…”�”}”(hj=h²hh³Nh´NubjO)�”}”(hŒ ``-ENOMEM``”h]”hŒ-ENOMEM”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jNhj=ubhŒ3 is returned in the case of an out-of-memory error.”…”�”}”(hj=h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KçhjubhÝ)�”}”(hŒHThe caller should lock exclusively against other modifiers of the array.”h]”hŒHThe caller should lock exclusively against other modifiers of the array.”…”�”}”(hj]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Këhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1hñhj h²hh³hÊh´Nubhò)�”}”(hXNDestroy an associative array, deleting all objects:: void assoc_array_destroy(struct assoc_array *array, const struct assoc_array_ops *ops); This destroys the contents of the associative array and leaves it completely empty. It is not permitted for another thread to be traversing the array under the RCU read lock at the same time as this function is destroying it as no RCU deferral is performed on memory release - something that would require memory to be allocated. The caller should lock exclusively against other modifiers and accessors of the array. ”h]”(hÝ)�”}”(hŒ4Destroy an associative array, deleting all objects::”h]”hŒ3Destroy an associative array, deleting all objects:”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kîhjqubji)�”}”(hŒpvoid assoc_array_destroy(struct assoc_array *array, const struct assoc_array_ops *ops);”h]”hŒpvoid assoc_array_destroy(struct assoc_array *array, const struct assoc_array_ops *ops);”…”�”}”hjƒsbah}”(h]”h ]”h"]”h$]”h&]”jxjyuh1jhh³hÊh´KðhjqubhÝ)�”}”(hXJThis destroys the contents of the associative array and leaves it completely empty. It is not permitted for another thread to be traversing the array under the RCU read lock at the same time as this function is destroying it as no RCU deferral is performed on memory release - something that would require memory to be allocated.”h]”hXJThis destroys the contents of the associative array and leaves it completely empty. It is not permitted for another thread to be traversing the array under the RCU read lock at the same time as this function is destroying it as no RCU deferral is performed on memory release - something that would require memory to be allocated.”…”�”}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KóhjqubhÝ)�”}”(hŒVThe caller should lock exclusively against other modifiers and accessors of the array.”h]”hŒVThe caller should lock exclusively against other modifiers and accessors of the array.”…”�”}”(hjŸh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kùhjqubeh}”(h]”h ]”h"]”h$]”h&]”uh1hñhj h²hh³hÊh´Nubhò)�”}”(hXUGarbage collect an associative array:: int assoc_array_gc(struct assoc_array *array, const struct assoc_array_ops *ops, bool (*iterator)(void *object, void *iterator_data), void *iterator_data); This iterates over the objects in an associative array and passes each one to ``iterator()``. If ``iterator()`` returns ``true``, the object is kept. If it returns ``false``, the object will be freed. If the ``iterator()`` function returns ``true``, it must perform any appropriate refcount incrementing on the object before returning. The internal tree will be packed down if possible as part of the iteration to reduce the number of nodes in it. The ``iterator_data`` is passed directly to ``iterator()`` and is otherwise ignored by the function. The function will return ``0`` if successful and ``-ENOMEM`` if there wasn't enough memory. It is possible for other threads to iterate over or search the array under the RCU read lock while this function is in progress. The caller should lock exclusively against other modifiers of the array. ”h]”(hÝ)�”}”(hŒ&Garbage collect an associative array::”h]”hŒ%Garbage collect an associative array:”…”�”}”(hj·h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kýhj³ubji)�”}”(hŒÔint assoc_array_gc(struct assoc_array *array, const struct assoc_array_ops *ops, bool (*iterator)(void *object, void *iterator_data), void *iterator_data);”h]”hŒÔint assoc_array_gc(struct assoc_array *array, const struct assoc_array_ops *ops, bool (*iterator)(void *object, void *iterator_data), void *iterator_data);”…”�”}”hjÅsbah}”(h]”h ]”h"]”h$]”h&]”jxjyuh1jhh³hÊh´Kÿhj³ubhÝ)�”}”(hXQThis iterates over the objects in an associative array and passes each one to ``iterator()``. If ``iterator()`` returns ``true``, the object is kept. If it returns ``false``, the object will be freed. If the ``iterator()`` function returns ``true``, it must perform any appropriate refcount incrementing on the object before returning.”h]”(hŒNThis iterates over the objects in an associative array and passes each one to ”…”�”}”(hjÓh²hh³Nh´NubjO)�”}”(hŒ``iterator()``”h]”hŒ iterator()”…”�”}”(hjÛh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jNhjÓubhŒ. If ”…”�”}”(hjÓh²hh³Nh´NubjO)�”}”(hŒ``iterator()``”h]”hŒ iterator()”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jNhjÓubhŒ returns ”…”�”}”(hjÓh²hh³Nh´NubjO)�”}”(hŒ``true``”h]”hŒtrue”…”�”}”(hjÿh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jNhjÓubhŒ$, the object is kept. If it returns ”…”�”}”(hjÓh²hh³Nh´NubjO)�”}”(hŒ ``false``”h]”hŒfalse”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jNhjÓubhŒ$, the object will be freed. If the ”…”�”}”(hjÓh²hh³Nh´NubjO)�”}”(hŒ``iterator()``”h]”hŒ iterator()”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jNhjÓubhŒ function returns ”…”�”}”(hjÓh²hh³Nh´NubjO)�”}”(hŒ``true``”h]”hŒtrue”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jNhjÓubhŒW, it must perform any appropriate refcount incrementing on the object before returning.”…”�”}”(hjÓh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhj³ubhÝ)�”}”(hŒoThe internal tree will be packed down if possible as part of the iteration to reduce the number of nodes in it.”h]”hŒoThe internal tree will be packed down if possible as part of the iteration to reduce the number of nodes in it.”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M hj³ubhÝ)�”}”(hŒdThe ``iterator_data`` is passed directly to ``iterator()`` and is otherwise ignored by the function.”h]”(hŒThe ”…”�”}”(hj[h²hh³Nh´NubjO)�”}”(hŒ``iterator_data``”h]”hŒ iterator_data”…”�”}”(hjch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jNhj[ubhŒ is passed directly to ”…”�”}”(hj[h²hh³Nh´NubjO)�”}”(hŒ``iterator()``”h]”hŒ iterator()”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jNhj[ubhŒ* and is otherwise ignored by the function.”…”�”}”(hj[h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M hj³ubhÝ)�”}”(hŒ[The function will return ``0`` if successful and ``-ENOMEM`` if there wasn't enough memory.”h]”(hŒThe function will return ”…”�”}”(hj�h²hh³Nh´NubjO)�”}”(hŒ``0``”h]”hŒ0”…”�”}”(hj•h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jNhj�ubhŒ if successful and ”…”�”}”(hj�h²hh³Nh´NubjO)�”}”(hŒ ``-ENOMEM``”h]”hŒ-ENOMEM”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jNhj�ubhŒ! if there wasn’t enough memory.”…”�”}”(hj�h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhj³ubhÝ)�”}”(hŒÊIt is possible for other threads to iterate over or search the array under the RCU read lock while this function is in progress. The caller should lock exclusively against other modifiers of the array.”h]”hŒÊIt is possible for other threads to iterate over or search the array under the RCU read lock while this function is in progress. The caller should lock exclusively against other modifiers of the array.”…”�”}”(hj¿h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhj³ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hñhj h²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jjjhjjŒstart”Kuh1hìhjŒh²hh³hÊh´KÞubeh}”(h]”Œmanipulation-functions”ah ]”h"]”Œmanipulation functions”ah$]”h&]”uh1hµhj5h²hh³hÊh´K¦ubh¶)�”}”(hhh]”(h»)�”}”(hŒAccess Functions”h]”hŒAccess Functions”…”�”}”(hjåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjâh²hh³hÊh´MubhÝ)�”}”(hŒ;There are two functions for accessing an associative array:”h]”hŒ;There are two functions for accessing an associative array:”…”�”}”(hjóh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhjâh²hubhí)�”}”(hhh]”(hò)�”}”(hXÛIterate over all the objects in an associative array:: int assoc_array_iterate(const struct assoc_array *array, int (*iterator)(const void *object, void *iterator_data), void *iterator_data); This passes each object in the array to the iterator callback function. ``iterator_data`` is private data for that function. This may be used on an array at the same time as the array is being modified, provided the RCU read lock is held. Under such circumstances, it is possible for the iteration function to see some objects twice. If this is a problem, then modification should be locked against. The iteration algorithm should not, however, miss any objects. The function will return ``0`` if no objects were in the array or else it will return the result of the last iterator function called. Iteration stops immediately if any call to the iteration function results in a non-zero return. ”h]”(hÝ)�”}”(hŒ6Iterate over all the objects in an associative array::”h]”hŒ5Iterate over all the objects in an associative array:”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhj ubji)�”}”(hŒàint assoc_array_iterate(const struct assoc_array *array, int (*iterator)(const void *object, void *iterator_data), void *iterator_data);”h]”hŒàint assoc_array_iterate(const struct assoc_array *array, int (*iterator)(const void *object, void *iterator_data), void *iterator_data);”…”�”}”hj sbah}”(h]”h ]”h"]”h$]”h&]”jxjyuh1jhh³hÊh´Mhj ubhÝ)�”}”(hŒ|This passes each object in the array to the iterator callback function. ``iterator_data`` is private data for that function.”h]”(hŒHThis passes each object in the array to the iterator callback function. ”…”�”}”(hj$ h²hh³Nh´NubjO)�”}”(hŒ``iterator_data``”h]”hŒ iterator_data”…”�”}”(hj, h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jNhj$ ubhŒ# is private data for that function.”…”�”}”(hj$ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M$hj ubhÝ)�”}”(hXTThis may be used on an array at the same time as the array is being modified, provided the RCU read lock is held. Under such circumstances, it is possible for the iteration function to see some objects twice. If this is a problem, then modification should be locked against. The iteration algorithm should not, however, miss any objects.”h]”hXTThis may be used on an array at the same time as the array is being modified, provided the RCU read lock is held. Under such circumstances, it is possible for the iteration function to see some objects twice. If this is a problem, then modification should be locked against. The iteration algorithm should not, however, miss any objects.”…”�”}”(hjD h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M'hj ubhÝ)�”}”(hŒçThe function will return ``0`` if no objects were in the array or else it will return the result of the last iterator function called. Iteration stops immediately if any call to the iteration function results in a non-zero return.”h]”(hŒThe function will return ”…”�”}”(hjR h²hh³Nh´NubjO)�”}”(hŒ``0``”h]”hŒ0”…”�”}”(hjZ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jNhjR ubhŒÉ if no objects were in the array or else it will return the result of the last iterator function called. Iteration stops immediately if any call to the iteration function results in a non-zero return.”…”�”}”(hjR h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M-hj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hñhj h²hh³hÊh´Nubhò)�”}”(hX.Find an object in an associative array:: void *assoc_array_find(const struct assoc_array *array, const struct assoc_array_ops *ops, const void *index_key); This walks through the array's internal tree directly to the object specified by the index key. This may be used on an array at the same time as the array is being modified, provided the RCU read lock is held. The function will return the object if found (and set ``*_type`` to the object type) or will return ``NULL`` if the object was not found. ”h]”(hÝ)�”}”(hŒ(Find an object in an associative array::”h]”hŒ'Find an object in an associative array:”…”�”}”(hj| h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M3hjx ubji)�”}”(hŒ void *assoc_array_find(const struct assoc_array *array, const struct assoc_array_ops *ops, const void *index_key);”h]”hŒ void *assoc_array_find(const struct assoc_array *array, const struct assoc_array_ops *ops, const void *index_key);”…”�”}”hjŠ sbah}”(h]”h ]”h"]”h$]”h&]”jxjyuh1jhh³hÊh´M5hjx ubhÝ)�”}”(hŒ_This walks through the array's internal tree directly to the object specified by the index key.”h]”hŒaThis walks through the array’s internal tree directly to the object specified by the index key.”…”�”}”(hj˜ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M9hjx ubhÝ)�”}”(hŒqThis may be used on an array at the same time as the array is being modified, provided the RCU read lock is held.”h]”hŒqThis may be used on an array at the same time as the array is being modified, provided the RCU read lock is held.”…”�”}”(hj¦ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M<hjx ubhÝ)�”}”(hŒ‰The function will return the object if found (and set ``*_type`` to the object type) or will return ``NULL`` if the object was not found.”h]”(hŒ6The function will return the object if found (and set ”…”�”}”(hj´ h²hh³Nh´NubjO)�”}”(hŒ ``*_type``”h]”hŒ*_type”…”�”}”(hj¼ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jNhj´ ubhŒ$ to the object type) or will return ”…”�”}”(hj´ h²hh³Nh´NubjO)�”}”(hŒ``NULL``”h]”hŒNULL”…”�”}”(hjÎ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jNhj´ ubhŒ if the object was not found.”…”�”}”(hj´ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M?hjx ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hñhj h²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jjjhjjuh1hìhjâh²hh³hÊh´Mubeh}”(h]”Œaccess-functions”ah ]”h"]”Œaccess functions”ah$]”h&]”uh1hµhj5h²hh³hÊh´Mubh¶)�”}”(hhh]”(h»)�”}”(hŒIndex Key Form”h]”hŒIndex Key Form”…”�”}”(hjý h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjú h²hh³hÊh´MDubhÝ)�”}”(hŒ÷The index key can be of any form, but since the algorithms aren't told how long the key is, it is strongly recommended that the index key includes its length very early on before any variation due to the length would have an effect on comparisons.”h]”hŒùThe index key can be of any form, but since the algorithms aren’t told how long the key is, it is strongly recommended that the index key includes its length very early on before any variation due to the length would have an effect on comparisons.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MFhjú h²hubhÝ)�”}”(hŒŒThis will cause leaves with different length keys to scatter away from each other - and those with the same length keys to cluster together.”h]”hŒŒThis will cause leaves with different length keys to scatter away from each other - and those with the same length keys to cluster together.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MKhjú h²hubhÝ)�”}”(hŒ~It is also recommended that the index key begin with a hash of the rest of the key to maximise scattering throughout keyspace.”h]”hŒ~It is also recommended that the index key begin with a hash of the rest of the key to maximise scattering throughout keyspace.”…”�”}”(hj' h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MNhjú h²hubhÝ)�”}”(hŒIThe better the scattering, the wider and lower the internal tree will be.”h]”hŒIThe better the scattering, the wider and lower the internal tree will be.”…”�”}”(hj5 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MQhjú h²hubhÝ)�”}”(hŒ‚Poor scattering isn't too much of a problem as there are shortcuts and nodes can contain mixtures of leaves and metadata pointers.”h]”hŒ„Poor scattering isn’t too much of a problem as there are shortcuts and nodes can contain mixtures of leaves and metadata pointers.”…”�”}”(hjC h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MShjú h²hubhÝ)�”}”(hX;The index key is read in chunks of machine word. Each chunk is subdivided into one nibble (4 bits) per level, so on a 32-bit CPU this is good for 8 levels and on a 64-bit CPU, 16 levels. Unless the scattering is really poor, it is unlikely that more than one word of any particular index key will have to be used.”h]”hX;The index key is read in chunks of machine word. Each chunk is subdivided into one nibble (4 bits) per level, so on a 32-bit CPU this is good for 8 levels and on a 64-bit CPU, 16 levels. Unless the scattering is really poor, it is unlikely that more than one word of any particular index key will have to be used.”…”�”}”(hjQ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MVhjú h²hubeh}”(h]”Œindex-key-form”ah ]”h"]”Œindex key form”ah$]”h&]”uh1hµhj5h²hh³hÊh´MDubeh}”(h]”Œthe-public-api”ah ]”h"]”Œthe public api”ah$]”h&]”uh1hµhh·h²hh³hÊh´K9ubh¶)�”}”(hhh]”(h»)�”}”(hŒInternal Workings”h]”hŒInternal Workings”…”�”}”(hjr h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjo h²hh³hÊh´M^ubhÝ)�”}”(hŒŠThe associative array data structure has an internal tree. This tree is constructed of two types of metadata blocks: nodes and shortcuts.”h]”hŒŠThe associative array data structure has an internal tree. This tree is constructed of two types of metadata blocks: nodes and shortcuts.”…”�”}”(hj€ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M`hjo h²hubhÝ)�”}”(hŒGA node is an array of slots. Each slot can contain one of four things:”h]”hŒGA node is an array of slots. Each slot can contain one of four things:”…”�”}”(hjŽ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mchjo h²hubhŒ bullet_list”“”)�”}”(hhh]”(hò)�”}”(hŒ2A NULL pointer, indicating that the slot is empty.”h]”hÝ)�”}”(hj£ h]”hŒ2A NULL pointer, indicating that the slot is empty.”…”�”}”(hj¥ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mehj¡ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hñhjž h²hh³hÊh´Nubhò)�”}”(hŒ A pointer to an object (a leaf).”h]”hÝ)�”}”(hjº h]”hŒ A pointer to an object (a leaf).”…”�”}”(hj¼ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mfhj¸ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hñhjž h²hh³hÊh´Nubhò)�”}”(hŒ&A pointer to a node at the next level.”h]”hÝ)�”}”(hjÑ h]”hŒ&A pointer to a node at the next level.”…”�”}”(hjÓ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MghjÏ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hñhjž h²hh³hÊh´Nubhò)�”}”(hŒA pointer to a shortcut. ”h]”hÝ)�”}”(hŒA pointer to a shortcut.”h]”hŒA pointer to a shortcut.”…”�”}”(hjê h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhhjæ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hñhjž h²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ*”uh1jœ h³hÊh´Mehjo h²hubh¶)�”}”(hhh]”(h»)�”}”(hŒBasic Internal Tree Layout”h]”hŒBasic Internal Tree Layout”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj h²hh³hÊh´MlubhÝ)�”}”(hŒ¹Ignoring shortcuts for the moment, the nodes form a multilevel tree. The index key space is strictly subdivided by the nodes in the tree and nodes occur on fixed levels. For example::”h]”hŒ¸Ignoring shortcuts for the moment, the nodes form a multilevel tree. The index key space is strictly subdivided by the nodes in the tree and nodes occur on fixed levels. For example:”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mnhj h²hubji)�”}”(hX$Level: 0 1 2 3 =============== =============== =============== =============== NODE D NODE B NODE C +------>+---+ +------>+---+ +------>+---+ | | 0 | NODE A | | 0 | | | 0 | | +---+ +---+ | +---+ | +---+ | : : | 0 | | : : | : : | +---+ +---+ | +---+ | +---+ | | f | | 1 |---+ | 3 |---+ | 7 |---+ +---+ +---+ +---+ +---+ : : : : | 8 |---+ +---+ +---+ +---+ | NODE E | e |---+ | f | : : +------>+---+ +---+ | +---+ +---+ | 0 | | f | | | f | +---+ +---+ | +---+ : : | NODE F +---+ +------>+---+ | f | | 0 | NODE G +---+ +---+ +------>+---+ : : | | 0 | +---+ | +---+ | 6 |---+ : : +---+ +---+ : : | f | +---+ +---+ | f | +---+”h]”hX$Level: 0 1 2 3 =============== =============== =============== =============== NODE D NODE B NODE C +------>+---+ +------>+---+ +------>+---+ | | 0 | NODE A | | 0 | | | 0 | | +---+ +---+ | +---+ | +---+ | : : | 0 | | : : | : : | +---+ +---+ | +---+ | +---+ | | f | | 1 |---+ | 3 |---+ | 7 |---+ +---+ +---+ +---+ +---+ : : : : | 8 |---+ +---+ +---+ +---+ | NODE E | e |---+ | f | : : +------>+---+ +---+ | +---+ +---+ | 0 | | f | | | f | +---+ +---+ | +---+ : : | NODE F +---+ +------>+---+ | f | | 0 | NODE G +---+ +---+ +------>+---+ : : | | 0 | +---+ | +---+ | 6 |---+ : : +---+ +---+ : : | f | +---+ +---+ | f | +---+”…”�”}”hj% sbah}”(h]”h ]”h"]”h$]”h&]”jxjyuh1jhh³hÊh´Mrhj h²hubhÝ)�”}”(hŒ˜In the above example, there are 7 nodes (A-G), each with 16 slots (0-f). Assuming no other meta data nodes in the tree, the key space is divided thusly:”h]”hŒ˜In the above example, there are 7 nodes (A-G), each with 16 slots (0-f). Assuming no other meta data nodes in the tree, the key space is divided thusly:”…”�”}”(hj3 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M�hj h²hubhŒ block_quote”“”)�”}”(hŒÒ=========== ==== KEY PREFIX NODE =========== ==== 137* D 138* E 13[0-69-f]* C 1[0-24-f]* B e6* G e[0-57-f]* F [02-df]* A =========== ==== ”h]”hŒtable”“”)�”}”(hhh]”hŒtgroup”“”)�”}”(hhh]”(hŒcolspec”“”)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”K uh1jQ hjN ubjR )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jQ hjN ubhŒthead”“”)�”}”(hhh]”hŒrow”“”)�”}”(hhh]”(hŒentry”“”)�”}”(hhh]”hÝ)�”}”(hŒ KEY PREFIX”h]”hŒ KEY PREFIX”…”�”}”(hjv h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M•hjs ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjn ubjr )�”}”(hhh]”hÝ)�”}”(hŒNODE”h]”hŒNODE”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M•hjŠ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjn ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hji ubah}”(h]”h ]”h"]”h$]”h&]”uh1jg hjN ubhŒtbody”“”)�”}”(hhh]”(jm )�”}”(hhh]”(jr )�”}”(hhh]”hÝ)�”}”(hŒ137*”h]”hŒ137*”…”�”}”(hj¸ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M—hjµ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj² ubjr )�”}”(hhh]”hÝ)�”}”(hŒD”h]”hŒD”…”�”}”(hjÏ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M—hjÌ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj² ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hj¯ ubjm )�”}”(hhh]”(jr )�”}”(hhh]”hÝ)�”}”(hŒ138*”h]”hŒ138*”…”�”}”(hjï h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M˜hjì ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjé ubjr )�”}”(hhh]”hÝ)�”}”(hŒE”h]”hŒE”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M˜hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjé ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hj¯ ubjm )�”}”(hhh]”(jr )�”}”(hhh]”hÝ)�”}”(hŒ 13[0-69-f]*”h]”hŒ 13[0-69-f]*”…”�”}”(hj& h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M™hj# ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj ubjr )�”}”(hhh]”hÝ)�”}”(hŒC”h]”hŒC”…”�”}”(hj= h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M™hj: ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hj¯ ubjm )�”}”(hhh]”(jr )�”}”(hhh]”hÝ)�”}”(hŒ 1[0-24-f]*”h]”hŒ 1[0-24-f]*”…”�”}”(hj] h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MšhjZ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjW ubjr )�”}”(hhh]”hÝ)�”}”(hŒB”h]”hŒB”…”�”}”(hjt h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mšhjq ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjW ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hj¯ ubjm )�”}”(hhh]”(jr )�”}”(hhh]”hÝ)�”}”(hŒe6*”h]”hŒe6*”…”�”}”(hj” h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M›hj‘ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjŽ ubjr )�”}”(hhh]”hÝ)�”}”(hŒG”h]”hŒG”…”�”}”(hj« h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M›hj¨ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjŽ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hj¯ ubjm )�”}”(hhh]”(jr )�”}”(hhh]”hÝ)�”}”(hŒ e[0-57-f]*”h]”hŒ e[0-57-f]*”…”�”}”(hjË h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MœhjÈ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjÅ ubjr )�”}”(hhh]”hÝ)�”}”(hŒF”h]”hŒF”…”�”}”(hjâ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mœhjß ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjÅ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hj¯ ubjm )�”}”(hhh]”(jr )�”}”(hhh]”hÝ)�”}”(hŒ[02-df]*”h]”hŒ[02-df]*”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M�hjÿ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjü ubjr )�”}”(hhh]”hÝ)�”}”(hŒA”h]”hŒA”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M�hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjü ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hj¯ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j­ hjN ubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1jL hjI ubah}”(h]”h ]”h"]”h$]”h&]”uh1jG hjC ubah}”(h]”h ]”h"]”h$]”h&]”uh1jA h³hÊh´M”hj h²hubhÝ)�”}”(hŒdSo, for instance, keys with the following example index keys will be found in the appropriate nodes:”h]”hŒdSo, for instance, keys with the following example index keys will be found in the appropriate nodes:”…”�”}”(hjL h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M hj h²hubjB )�”}”(hX¬=============== ======= ==== INDEX KEY PREFIX NODE =============== ======= ==== 13694892892489 13 C 13795289025897 137 D 13889dde88793 138 E 138bbb89003093 138 E 1394879524789 12 C 1458952489 1 B 9431809de993ba \- A b4542910809cd \- A e5284310def98 e F e68428974237 e6 G e7fffcbd443 e F f3842239082 \- A =============== ======= ==== ”h]”jH )�”}”(hhh]”jM )�”}”(hhh]”(jR )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jQ hja ubjR )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jQ hja ubjR )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jQ hja ubjh )�”}”(hhh]”jm )�”}”(hhh]”(jr )�”}”(hhh]”hÝ)�”}”(hŒ INDEX KEY”h]”hŒ INDEX KEY”…”�”}”(hj‹ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M¤hjˆ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj… ubjr )�”}”(hhh]”hÝ)�”}”(hŒPREFIX”h]”hŒPREFIX”…”�”}”(hj¢ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M¤hjŸ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj… ubjr )�”}”(hhh]”hÝ)�”}”(hŒNODE”h]”hŒNODE”…”�”}”(hj¹ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M¤hj¶ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj… ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hj‚ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jg hja ubj® )�”}”(hhh]”(jm )�”}”(hhh]”(jr )�”}”(hhh]”hÝ)�”}”(hŒ13694892892489”h]”hŒ13694892892489”…”�”}”(hjâ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M¦hjß ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjÜ ubjr )�”}”(hhh]”hÝ)�”}”(hŒ13”h]”hŒ13”…”�”}”(hjù h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M¦hjö ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjÜ ubjr )�”}”(hhh]”hÝ)�”}”(hj? h]”hŒC”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M¦hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjÜ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hjÙ ubjm )�”}”(hhh]”(jr )�”}”(hhh]”hÝ)�”}”(hŒ13795289025897”h]”hŒ13795289025897”…”�”}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M§hj,ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj)ubjr )�”}”(hhh]”hÝ)�”}”(hŒ137”h]”hŒ137”…”�”}”(hjFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M§hjCubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj)ubjr )�”}”(hhh]”hÝ)�”}”(hjÑ h]”hŒD”…”�”}”(hj]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M§hjZubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj)ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hjÙ ubjm )�”}”(hhh]”(jr )�”}”(hhh]”hÝ)�”}”(hŒ 13889dde88793”h]”hŒ 13889dde88793”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M¨hjyuba•Å|h}”(h]”h ]”h"]”h$]”h&]”uh1jq hjvubjr )�”}”(hhh]”hÝ)�”}”(hŒ138”h]”hŒ138”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M¨hj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjvubjr )�”}”(hhh]”hÝ)�”}”(hj h]”hŒE”…”�”}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M¨hj§ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjvubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hjÙ ubjm )�”}”(hhh]”(jr )�”}”(hhh]”hÝ)�”}”(hŒ138bbb89003093”h]”hŒ138bbb89003093”…”�”}”(hjÉh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M©hjÆubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjÃubjr )�”}”(hhh]”hÝ)�”}”(hŒ138”h]”hŒ138”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M©hjÝubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjÃubjr )�”}”(hhh]”hÝ)�”}”(hj h]”hŒE”…”�”}”(hj÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M©hjôubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjÃubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hjÙ ubjm )�”}”(hhh]”(jr )�”}”(hhh]”hÝ)�”}”(hŒ 1394879524789”h]”hŒ 1394879524789”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mªhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjubjr )�”}”(hhh]”hÝ)�”}”(hŒ12”h]”hŒ12”…”�”}”(hj-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mªhj*ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjubjr )�”}”(hhh]”hÝ)�”}”(hj? h]”hŒC”…”�”}”(hjDh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MªhjAubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hjÙ ubjm )�”}”(hhh]”(jr )�”}”(hhh]”hÝ)�”}”(hŒ 1458952489”h]”hŒ 1458952489”…”�”}”(hjch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M«hj`ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj]ubjr )�”}”(hhh]”hÝ)�”}”(hŒ1”h]”hŒ1”…”�”}”(hjzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M«hjwubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj]ubjr )�”}”(hhh]”hÝ)�”}”(hjv h]”hŒB”…”�”}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M«hjŽubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj]ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hjÙ ubjm )�”}”(hhh]”(jr )�”}”(hhh]”hÝ)�”}”(hŒ9431809de993ba”h]”hŒ9431809de993ba”…”�”}”(hj°h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M¬hj­ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjªubjr )�”}”(hhh]”hÝ)�”}”(hŒ\-”h]”hŒ-”…”�”}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M¬hjÄubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjªubjr )�”}”(hhh]”hÝ)�”}”(hj h]”hŒA”…”�”}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M¬hjÛubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjªubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hjÙ ubjm )�”}”(hhh]”(jr )�”}”(hhh]”hÝ)�”}”(hŒ b4542910809cd”h]”hŒ b4542910809cd”…”�”}”(hjýh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M­hjúubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj÷ubjr )�”}”(hhh]”hÝ)�”}”(hŒ\-”h]”hŒ-”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M­hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj÷ubjr )�”}”(hhh]”hÝ)�”}”(hj h]”hŒA”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M­hj(ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj÷ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hjÙ ubjm )�”}”(hhh]”(jr )�”}”(hhh]”hÝ)�”}”(hŒ e5284310def98”h]”hŒ e5284310def98”…”�”}”(hjJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M®hjGubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjDubjr )�”}”(hhh]”hÝ)�”}”(hŒe”h]”hŒe”…”�”}”(hjah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M®hj^ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjDubjr )�”}”(hhh]”hÝ)�”}”(hjä h]”hŒF”…”�”}”(hjxh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M®hjuubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjDubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hjÙ ubjm )�”}”(hhh]”(jr )�”}”(hhh]”hÝ)�”}”(hŒ e68428974237”h]”hŒ e68428974237”…”�”}”(hj—h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M¯hj”ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj‘ubjr )�”}”(hhh]”hÝ)�”}”(hŒe6”h]”hŒe6”…”�”}”(hj®h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M¯hj«ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj‘ubjr )�”}”(hhh]”hÝ)�”}”(hj­ h]”hŒG”…”�”}”(hjÅh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M¯hjÂubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj‘ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hjÙ ubjm )�”}”(hhh]”(jr )�”}”(hhh]”hÝ)�”}”(hŒ e7fffcbd443”h]”hŒ e7fffcbd443”…”�”}”(hjäh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M°hjáubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjÞubjr )�”}”(hhh]”hÝ)�”}”(hjch]”hŒe”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M°hjøubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjÞubjr )�”}”(hhh]”hÝ)�”}”(hjä h]”hŒF”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M°hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjÞubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hjÙ ubjm )�”}”(hhh]”(jr )�”}”(hhh]”hÝ)�”}”(hŒ f3842239082”h]”hŒ f3842239082”…”�”}”(hj0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M±hj-ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj*ubjr )�”}”(hhh]”hÝ)�”}”(hŒ\-”h]”hŒ-”…”�”}”(hjGh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M±hjDubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj*ubjr )�”}”(hhh]”hÝ)�”}”(hj h]”hŒA”…”�”}”(hj^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M±hj[ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj*ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hjÙ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j­ hja ubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1jL hj^ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jG hjZ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jA h³hÊh´M£hj h²hubhÝ)�”}”(hŒæTo save memory, if a node can hold all the leaves in its portion of keyspace, then the node will have all those leaves in it and will not have any metadata pointers - even if some of those leaves would like to be in the same slot.”h]”hŒæTo save memory, if a node can hold all the leaves in its portion of keyspace, then the node will have all those leaves in it and will not have any metadata pointers - even if some of those leaves would like to be in the same slot.”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M´hj h²hubhÝ)�”}”(hXÕA node can contain a heterogeneous mix of leaves and metadata pointers. Metadata pointers must be in the slots that match their subdivisions of key space. The leaves can be in any slot not occupied by a metadata pointer. It is guaranteed that none of the leaves in a node will match a slot occupied by a metadata pointer. If the metadata pointer is there, any leaf whose key matches the metadata key prefix must be in the subtree that the metadata pointer points to.”h]”hXÕA node can contain a heterogeneous mix of leaves and metadata pointers. Metadata pointers must be in the slots that match their subdivisions of key space. The leaves can be in any slot not occupied by a metadata pointer. It is guaranteed that none of the leaves in a node will match a slot occupied by a metadata pointer. If the metadata pointer is there, any leaf whose key matches the metadata key prefix must be in the subtree that the metadata pointer points to.”…”�”}”(hjžh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M¸hj h²hubhÝ)�”}”(hŒ=In the above example list of index keys, node A will contain:”h]”hŒ=In the above example list of index keys, node A will contain:”…”�”}”(hj¬h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÀhj h²hubjB )�”}”(hXS==== =============== ================== SLOT CONTENT INDEX KEY (PREFIX) ==== =============== ================== 1 PTR TO NODE B 1* any LEAF 9431809de993ba any LEAF b4542910809cd e PTR TO NODE F e* any LEAF f3842239082 ==== =============== ================== ”h]”jH )�”}”(hhh]”jM )�”}”(hhh]”(jR )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jQ hjÁubjR )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jQ hjÁubjR )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jQ hjÁubjh )�”}”(hhh]”jm )�”}”(hhh]”(jr )�”}”(hhh]”hÝ)�”}”(hŒSLOT”h]”hŒSLOT”…”�”}”(hjëh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÃhjèubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjåubjr )�”}”(hhh]”hÝ)�”}”(hŒCONTENT”h]”hŒCONTENT”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÃhjÿubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjåubjr )�”}”(hhh]”hÝ)�”}”(hŒINDEX KEY (PREFIX)”h]”hŒINDEX KEY (PREFIX)”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÃhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjåubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hjâubah}”(h]”h ]”h"]”h$]”h&]”uh1jg hjÁubj® )�”}”(hhh]”(jm )�”}”(hhh]”(jr )�”}”(hhh]”hÝ)�”}”(hj|h]”hŒ1”…”�”}”(hjBh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÅhj?ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj<ubjr )�”}”(hhh]”hÝ)�”}”(hŒ PTR TO NODE B”h]”hŒ PTR TO NODE B”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÅhjUubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj<ubjr )�”}”(hhh]”hÝ)�”}”(hŒ1*”h]”hŒ1*”…”�”}”(hjoh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÅhjlubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj<ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hj9ubjm )�”}”(hhh]”(jr )�”}”(hhh]”hÝ)�”}”(hŒany”h]”hŒany”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÆhjŒubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj‰ubjr )�”}”(hhh]”hÝ)�”}”(hŒLEAF”h]”hŒLEAF”…”�”}”(hj¦h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÆhj£ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj‰ubjr )�”}”(hhh]”hÝ)�”}”(hŒ9431809de993ba”h]”hŒ9431809de993ba”…”�”}”(hj½h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÆhjºubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj‰ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hj9ubjm )�”}”(hhh]”(jr )�”}”(hhh]”hÝ)�”}”(hŒany”h]”hŒany”…”�”}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÇhjÚubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj×ubjr )�”}”(hhh]”hÝ)�”}”(hŒLEAF”h]”hŒLEAF”…”�”}”(hjôh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÇhjñubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj×ubjr )�”}”(hhh]”hÝ)�”}”(hŒ b4542910809cd”h]”hŒ b4542910809cd”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÇhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj×ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hj9ubjm )�”}”(hhh]”(jr )�”}”(hhh]”hÝ)�”}”(hjch]”hŒe”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÈhj(ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj%ubjr )�”}”(hhh]”hÝ)�”}”(hŒ PTR TO NODE F”h]”hŒ PTR TO NODE F”…”�”}”(hjAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÈhj>ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj%ubjr )�”}”(hhh]”hÝ)�”}”(hŒe*”h]”hŒe*”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÈhjUubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj%ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hj9ubjm )�”}”(hhh]”(jr )�”}”(hhh]”hÝ)�”}”(hŒany”h]”hŒany”…”�”}”(hjxh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÉhjuubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjrubjr )�”}”(hhh]”hÝ)�”}”(hŒLEAF”h]”hŒLEAF”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÉhjŒubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjrubjr )�”}”(hhh]”hÝ)�”}”(hŒ f3842239082”h]”hŒ f3842239082”…”�”}”(hj¦h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÉhj£ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjrubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hj9ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j­ hjÁubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1jL hj¾ubah}”(h]”h ]”h"]”h$]”h&]”uh1jG hjºubah}”(h]”h ]”h"]”h$]”h&]”uh1jA h³hÊh´MÂhj h²hubhÝ)�”}”(hŒ and node B:”h]”hŒ and node B:”…”�”}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÌhj h²hubjB )�”}”(hŒì==== =============== ================== SLOT CONTENT INDEX KEY (PREFIX) ==== =============== ================== 3 PTR TO NODE C 13* any LEAF 1458952489 ==== =============== ================== ”h]”jH )�”}”(hhh]”jM )�”}”(hhh]”(jR )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jQ hjîubjR )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jQ hjîubjR )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jQ hjîubjh )�”}”(hhh]”jm )�”}”(hhh]”(jr )�”}”(hhh]”hÝ)�”}”(hŒSLOT”h]”hŒSLOT”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÏhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjubjr )�”}”(hhh]”hÝ)�”}”(hŒCONTENT”h]”hŒCONTENT”…”�”}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÏhj,ubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjubjr )�”}”(hhh]”hÝ)�”}”(hŒINDEX KEY (PREFIX)”h]”hŒINDEX KEY (PREFIX)”…”�”}”(hjFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÏhjCubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jg hjîubj® )�”}”(hhh]”(jm )�”}”(hhh]”(jr )�”}”(hhh]”hÝ)�”}”(hŒ3”h]”hŒ3”…”�”}”(hjoh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÑhjlubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjiubjr )�”}”(hhh]”hÝ)�”}”(hŒ PTR TO NODE C”h]”hŒ PTR TO NODE C”…”�”}”(hj†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÑhjƒubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjiubjr )�”}”(hhh]”hÝ)�”}”(hŒ13*”h]”hŒ13*”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÑhjšubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hjiubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hjfubjm )�”}”(hhh]”(jr )�”}”(hhh]”hÝ)�”}”(hŒany”h]”hŒany”…”�”}”(hj½h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÒhjºubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj·ubjr )�”}”(hhh]”hÝ)�”}”(hŒLEAF”h]”hŒLEAF”…”�”}”(hjÔh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÒhjÑubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj·ubjr )�”}”(hhh]”hÝ)�”}”(hŒ 1458952489”h]”hŒ 1458952489”…”�”}”(hjëh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÒhjèubah}”(h]”h ]”h"]”h$]”h&]”uh1jq hj·ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jl hjfubeh}”(h]”h ]”h"]”h$]”h&]”uh1j­ hjîubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1jL hjëubah}”(h]”h ]”h"]”h$]”h&]”uh1jG hjçubah}”(h]”h ]”h"]”h$]”h&]”uh1jA h³hÊh´MÎhj h²hubeh}”(h]”Œbasic-internal-tree-layout”ah ]”h"]”Œbasic internal tree layout”ah$]”h&]”uh1hµhjo h²hh³hÊh´Mlubh¶)�”}”(hhh]”(h»)�”}”(hŒ Shortcuts”h]”hŒ Shortcuts”…”�”}”(hj)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj&h²hh³hÊh´M×ubhÝ)�”}”(hŒßShortcuts are metadata records that jump over a piece of keyspace. A shortcut is a replacement for a series of single-occupancy nodes ascending through the levels. Shortcuts exist to save memory and to speed up traversal.”h]”hŒßShortcuts are metadata records that jump over a piece of keyspace. A shortcut is a replacement for a series of single-occupancy nodes ascending through the levels. Shortcuts exist to save memory and to speed up traversal.”…”�”}”(hj7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÙhj&h²hubhÝ)�”}”(hX6It is possible for the root of the tree to be a shortcut - say, for example, the tree contains at least 17 nodes all with key prefix ``1111``. The insertion algorithm will insert a shortcut to skip over the ``1111`` keyspace in a single bound and get to the fourth level where these actually become different.”h]”(hŒ…It is possible for the root of the tree to be a shortcut - say, for example, the tree contains at least 17 nodes all with key prefix ”…”�”}”(hjEh²hh³Nh´NubjO)�”}”(hŒ``1111``”h]”hŒ1111”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jNhjEubhŒC. The insertion algorithm will insert a shortcut to skip over the ”…”�”}”(hjEh²hh³Nh´NubjO)�”}”(hŒ``1111``”h]”hŒ1111”…”�”}”(hj_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jNhjEubhŒ^ keyspace in a single bound and get to the fourth level where these actually become different.”…”�”}”(hjEh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÝhj&h²hubeh}”(h]”Œ shortcuts”ah ]”h"]”Œ shortcuts”ah$]”h&]”uh1hµhjo h²hh³hÊh´M×ubh¶)�”}”(hhh]”(h»)�”}”(hŒSplitting And Collapsing Nodes”h]”hŒSplitting And Collapsing Nodes”…”�”}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjh²hh³hÊh´MåubhÝ)�”}”(hXKEach node has a maximum capacity of 16 leaves and metadata pointers. If the insertion algorithm finds that it is trying to insert a 17th object into a node, that node will be split such that at least two leaves that have a common key segment at that level end up in a separate node rooted on that slot for that common key segment.”h]”hXKEach node has a maximum capacity of 16 leaves and metadata pointers. If the insertion algorithm finds that it is trying to insert a 17th object into a node, that node will be split such that at least two leaves that have a common key segment at that level end up in a separate node rooted on that slot for that common key segment.”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mçhjh²hubhÝ)�”}”(hŒŠIf the leaves in a full node and the leaf that is being inserted are sufficiently similar, then a shortcut will be inserted into the tree.”h]”hŒŠIf the leaves in a full node and the leaf that is being inserted are sufficiently similar, then a shortcut will be inserted into the tree.”…”�”}”(hjžh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Míhjh²hubhÝ)�”}”(hŒ¾When the number of objects in the subtree rooted at a node falls to 16 or fewer, then the subtree will be collapsed down to a single node - and this will ripple towards the root if possible.”h]”hŒ¾When the number of objects in the subtree rooted at a node falls to 16 or fewer, then the subtree will be collapsed down to a single node - and this will ripple towards the root if possible.”…”�”}”(hj¬h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mðhjh²hubeh}”(h]”Œsplitting-and-collapsing-nodes”ah ]”h"]”Œsplitting and collapsing nodes”ah$]”h&]”uh1hµhjo h²hh³hÊh´Måubh¶)�”}”(hhh]”(h»)�”}”(hŒNon-Recursive Iteration”h]”hŒNon-Recursive Iteration”…”�”}”(hjÅh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjÂh²hh³hÊh´MöubhÝ)�”}”(hX"Each node and shortcut contains a back pointer to its parent and the number of slot in that parent that points to it. None-recursive iteration uses these to proceed rootwards through the tree, going to the parent node, slot N + 1 to make sure progress is made without the need for a stack.”h]”hX"Each node and shortcut contains a back pointer to its parent and the number of slot in that parent that points to it. None-recursive iteration uses these to proceed rootwards through the tree, going to the parent node, slot N + 1 to make sure progress is made without the need for a stack.”…”�”}”(hjÓh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MøhjÂh²hubhÝ)�”}”(hŒMThe backpointers, however, make simultaneous alteration and iteration tricky.”h]”hŒMThe backpointers, however, make simultaneous alteration and iteration tricky.”…”�”}”(hjáh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MýhjÂh²hubeh}”(h]”Œnon-recursive-iteration”ah ]”h"]”Œnon-recursive iteration”ah$]”h&]”uh1hµhjo h²hh³hÊh´Möubh¶)�”}”(hhh]”(h»)�”}”(hŒ%Simultaneous Alteration And Iteration”h]”hŒ%Simultaneous Alteration And Iteration”…”�”}”(hjúh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj÷h²hh³hÊh´MubhÝ)�”}”(hŒ(There are a number of cases to consider:”h]”hŒ(There are a number of cases to consider:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhj÷h²hubhí)�”}”(hhh]”(hò)�”}”(hŒ÷Simple insert/replace. This involves simply replacing a NULL or old matching leaf pointer with the pointer to the new leaf after a barrier. The metadata blocks don't change otherwise. An old leaf won't be freed until after the RCU grace period. ”h]”hÝ)�”}”(hŒöSimple insert/replace. This involves simply replacing a NULL or old matching leaf pointer with the pointer to the new leaf after a barrier. The metadata blocks don't change otherwise. An old leaf won't be freed until after the RCU grace period.”h]”hŒúSimple insert/replace. This involves simply replacing a NULL or old matching leaf pointer with the pointer to the new leaf after a barrier. The metadata blocks don’t change otherwise. An old leaf won’t be freed until after the RCU grace period.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hñhjh²hh³hÊh´Nubhò)�”}”(hŒ®Simple delete. This involves just clearing an old matching leaf. The metadata blocks don't change otherwise. The old leaf won't be freed until after the RCU grace period. ”h]”hÝ)�”}”(hŒ­Simple delete. This involves just clearing an old matching leaf. The metadata blocks don't change otherwise. The old leaf won't be freed until after the RCU grace period.”h]”hŒ±Simple delete. This involves just clearing an old matching leaf. The metadata blocks don’t change otherwise. The old leaf won’t be freed until after the RCU grace period.”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M hj1ubah}”(h]”h ]”h"]”h$]”h&]”uh1hñhjh²hh³hÊh´Nubhò)�”}”(hXInsertion replacing part of a subtree that we haven't yet entered. This may involve replacement of part of that subtree - but that won't affect the iteration as we won't have reached the pointer to it yet and the ancestry blocks are not replaced (the layout of those does not change). ”h]”hÝ)�”}”(hXInsertion replacing part of a subtree that we haven't yet entered. This may involve replacement of part of that subtree - but that won't affect the iteration as we won't have reached the pointer to it yet and the ancestry blocks are not replaced (the layout of those does not change).”h]”hX#Insertion replacing part of a subtree that we haven’t yet entered. This may involve replacement of part of that subtree - but that won’t affect the iteration as we won’t have reached the pointer to it yet and the ancestry blocks are not replaced (the layout of those does not change).”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MhjIubah}”(h]”h ]”h"]”h$]”h&]”uh1hñhjh²hh³hÊh´Nubhò)�”}”(hXáInsertion replacing nodes that we're actively processing. This isn't a problem as we've passed the anchoring pointer and won't switch onto the new layout until we follow the back pointers - at which point we've already examined the leaves in the replaced node (we iterate over all the leaves in a node before following any of its metadata pointers). We might, however, re-see some leaves that have been split out into a new branch that's in a slot further along than we were at. ”h]”(hÝ)�”}”(hX^Insertion replacing nodes that we're actively processing. This isn't a problem as we've passed the anchoring pointer and won't switch onto the new layout until we follow the back pointers - at which point we've already examined the leaves in the replaced node (we iterate over all the leaves in a node before following any of its metadata pointers).”h]”hXhInsertion replacing nodes that we’re actively processing. This isn’t a problem as we’ve passed the anchoring pointer and won’t switch onto the new layout until we follow the back pointers - at which point we’ve already examined the leaves in the replaced node (we iterate over all the leaves in a node before following any of its metadata pointers).”…”�”}”(hjeh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MhjaubhÝ)�”}”(hŒ€We might, however, re-see some leaves that have been split out into a new branch that's in a slot further along than we were at.”h]”hŒ‚We might, however, re-see some leaves that have been split out into a new branch that’s in a slot further along than we were at.”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhjaubeh}”(h]”h ]”h"]”h$]”h&]”uh1hñhjh²hh³hÊh´Nubhò)�”}”(hŒ�Insertion replacing nodes that we're processing a dependent branch of. This won't affect us until we follow the back pointers. Similar to (4). ”h]”hÝ)�”}”(hŒ�Insertion replacing nodes that we're processing a dependent branch of. This won't affect us until we follow the back pointers. Similar to (4).”h]”hŒ“Insertion replacing nodes that we’re processing a dependent branch of. This won’t affect us until we follow the back pointers. Similar to (4).”…”�”}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhj‡ubah}”(h]”h ]”h"]”h$]”h&]”uh1hñhjh²hh³hÊh´Nubhò)�”}”(hXUDeletion collapsing a branch under us. This doesn't affect us because the back pointers will get us back to the parent of the new node before we could see the new node. The entire collapsed subtree is thrown away unchanged - and will still be rooted on the same slot, so we shouldn't process it a second time as we'll go back to slot + 1. ”h]”hÝ)�”}”(hXTDeletion collapsing a branch under us. This doesn't affect us because the back pointers will get us back to the parent of the new node before we could see the new node. The entire collapsed subtree is thrown away unchanged - and will still be rooted on the same slot, so we shouldn't process it a second time as we'll go back to slot + 1.”h]”hXZDeletion collapsing a branch under us. This doesn’t affect us because the back pointers will get us back to the parent of the new node before we could see the new node. The entire collapsed subtree is thrown away unchanged - and will still be rooted on the same slot, so we shouldn’t process it a second time as we’ll go back to slot + 1.”…”�”}”(hj£h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MhjŸubah}”(h]”h ]”h"]”h$]”h&]”uh1hñhjh²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jjjhjjuh1hìhj÷h²hh³hÊh´Mubj)�”}”(hXxUnder some circumstances, we need to simultaneously change the parent pointer and the parent slot pointer on a node (say, for example, we inserted another node before it and moved it up a level). We cannot do this without locking against a read - so we have to replace that node too. However, when we're changing a shortcut into a node this isn't a problem as shortcuts only have one slot and so the parent slot number isn't used when traversing backwards over one. This means that it's okay to change the slot number first - provided suitable barriers are used to make sure the parent slot number is read after the back pointer.”h]”(hÝ)�”}”(hXUnder some circumstances, we need to simultaneously change the parent pointer and the parent slot pointer on a node (say, for example, we inserted another node before it and moved it up a level). We cannot do this without locking against a read - so we have to replace that node too.”h]”hXUnder some circumstances, we need to simultaneously change the parent pointer and the parent slot pointer on a node (say, for example, we inserted another node before it and moved it up a level). We cannot do this without locking against a read - so we have to replace that node too.”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M'hj½ubhÝ)�”}”(hXZHowever, when we're changing a shortcut into a node this isn't a problem as shortcuts only have one slot and so the parent slot number isn't used when traversing backwards over one. This means that it's okay to change the slot number first - provided suitable barriers are used to make sure the parent slot number is read after the back pointer.”h]”hXbHowever, when we’re changing a shortcut into a node this isn’t a problem as shortcuts only have one slot and so the parent slot number isn’t used when traversing backwards over one. This means that it’s okay to change the slot number first - provided suitable barriers are used to make sure the parent slot number is read after the back pointer.”…”�”}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M,hj½ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jhj÷h²hh³hÊh´NubhÝ)�”}”(hŒÉObsolete blocks and leaves are freed up after an RCU grace period has passed, so as long as anyone doing walking or iteration holds the RCU read lock, the old superstructure should not go away on them.”h]”hŒÉObsolete blocks and leaves are freed up after an RCU grace period has passed, so as long as anyone doing walking or iteration holds the RCU read lock, the old superstructure should not go away on them.”…”�”}”(hjãh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M2hj÷h²hubeh}”(h]”Œ%simultaneous-alteration-and-iteration”ah ]”h"]”Œ%simultaneous alteration and iteration”ah$]”h&]”uh1hµhjo h²hh³hÊh´Mubeh}”(h]”Œinternal-workings”ah ]”h"]”Œinternal workings”ah$]”h&]”uh1hµhh·h²hh³hÊh´M^ubeh}”(h]”Œ(generic-associative-array-implementation”ah ]”h"]”Œ(generic associative array implementation”ah$]”h&]”uh1hµhhh²hh³hÊh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÊuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(hºNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”jq Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”j+Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÊŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(jjj2j/jl ji j»j¸j‰j†jßjÜj÷ jô jd ja jþjûj#j j|jyj¿j¼jôjñjöjóuŒ nametypes”}”(j‰j2‰jl ‰j»‰j‰‰j߉j÷ ‰jd ‰jþ‰j#‰j|‰j¿‰jô‰jö‰uh}”(jh·j/hËji j5j¸j¨j†j¾jÜjŒjô jâja jú jûjo j j jyj&j¼jjñjÂjój÷uŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”hŒsystem_message”“”)�”}”(hhh]”hÝ)�”}”(hŒ:Enumerated list start value not ordinal-1: "4" (ordinal 4)”h]”hŒ>Enumerated list start value not ordinal-1: “4â€� (ordinal 4)”…”�”}”(hj’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜhj�ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”ŒINFO”Œsource”hÊŒline”Kuh1j�hjŒh²hh³hÊh´KÞubaŒtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.