Function report |
Source Code:lib\assoc_array.c |
Create Date:2022-07-28 06:54:22 |
Last Modify:2020-03-12 14:18:49 | Copyright©Brick |
home page | Tree |
Annotation kernel can get tool activity | Download SCCT | Chinese |
Name:Handle insertion into a terminal node.
Proto:static bool assoc_array_insert_into_terminal_node(struct assoc_array_edit *edit, const struct assoc_array_ops *ops, const void *index_key, struct assoc_array_walk_result *result)
Type:bool
Parameter:
Type | Parameter | Name |
---|---|---|
struct assoc_array_edit * | edit | |
const struct assoc_array_ops * | ops | |
const void * | index_key | |
struct assoc_array_walk_result * | result |
499 | free_slot = -1 |
504 | When i < Number of slots per node cycle |
506 | If Not ptr Then |
510 | If assoc_array_ptr_is_leaf(ptr) && compare_object(assoc_array_ptr_to_leaf(ptr), index_key) Then |
524 | If free_slot >= 0 Then |
527 | adjust_count_on = node |
529 | Return true |
539 | new_n0 = kzalloc - allocate memory. The memory is set to zero.*@size: how many bytes of memory are required.*@flags: the type of memory to allocate (see kmalloc). |
540 | If Not new_n0 Then Return false |
542 | new_meta[0] = assoc_array_node_to_ptr(new_n0) |
543 | new_n1 = kzalloc - allocate memory. The memory is set to zero.*@size: how many bytes of memory are required.*@flags: the type of memory to allocate (see kmalloc). |
544 | If Not new_n1 Then Return false |
546 | new_meta[1] = assoc_array_node_to_ptr(new_n1) |
549 | pr_devel("no spare slots\n") |
550 | have_meta = false |
551 | When i < Number of slots per node cycle |
553 | If assoc_array_ptr_is_meta(ptr) Then |
560 | base_seg >>= level & ASSOC_ARRAY_KEY_CHUNK_MASK |
561 | segment_cache[i] = base_seg & ASSOC_ARRAY_FAN_MASK |
564 | If have_meta Then |
565 | pr_devel("have meta\n") |
566 | Go to split_node |
570 | dissimilarity = 0 |
571 | base_seg = segment_cache[0] |
572 | When i < Number of slots per node cycle dissimilarity |= segment_cache[i] ^ base_seg |
575 | pr_devel("only leaves; dissimilarity=%lx\n", dissimilarity) |
577 | If (dissimilarity & ASSOC_ARRAY_FAN_MASK) == 0 Then |
581 | If (segment_cache[Number of slots per node ] ^ base_seg) == 0 Then Go to all_leaves_cluster_together |
592 | pr_devel("present leaves cluster but not new leaf\n") |
595 | split_node : |
596 | pr_devel("split node\n") |
613 | to = assoc_array_node_to_ptr(new_n0) |
614 | back_pointer = back_pointer |
615 | parent_slot = parent_slot |
617 | parent_slot = -1 |
619 | do_split_node : |
620 | pr_devel("do_split_node\n") |
623 | nr_leaves_on_branch = 0 |
631 | When i < Number of slots per node cycle |
632 | slot = segment_cache[i] |
633 | If slot != 0xff Then When j < Number of slots per node + 1 cycle |
635 | If segment_cache[j] == slot Then Go to found_slot_for_multiple_occupancy |
640 | BUG_ON(i >= Number of slots per node ) |
641 | BUG_ON(j >= Number of slots per node + 1) |
642 | BUG_ON(slot >= Number of slots per node ) |
644 | parent_slot = slot |
647 | When i < Number of slots per node cycle If assoc_array_ptr_is_meta(slots[i]) Then |
653 | slots[slot] = assoc_array_node_to_ptr(new_n1) |
656 | free_slot = -1 |
657 | next_slot = 0 |
658 | When i < Number of slots per node cycle |
659 | If assoc_array_ptr_is_meta(slots[i]) Then Continue |
661 | If segment_cache[i] == slot Then |
663 | nr_leaves_on_branch++ |
664 | Else |
674 | If segment_cache[Number of slots per node ] != slot Then |
680 | Else |
682 | adjust_count_on = new_n1 |
688 | When i < Number of slots per node cycle |
689 | If segment_cache[i] == 0xff Then |
691 | BUG_ON(assoc_array_ptr_is_leaf(ptr)) |
692 | If assoc_array_ptr_is_node(ptr) Then |
693 | side = assoc_array_ptr_to_node(ptr) |
694 | set_backpointers[i] = back_pointer |
695 | Else |
697 | set_backpointers[i] = back_pointer |
702 | ptr = back_pointer |
703 | If Not ptr Then ptr = The node at the root of the tree |
705 | Else if assoc_array_ptr_is_node(ptr) Then ptr = slots[parent_slot] |
709 | excised_meta[0] = assoc_array_node_to_ptr(node) |
711 | Return true |
728 | pr_devel("all leaves cluster together\n") |
730 | When i < Number of slots per node cycle |
731 | x = diff_objects(assoc_array_ptr_to_leaf(slots[i]), index_key) |
739 | BUG_ON(diff < level + ASSOC_ARRAY_LEVEL_STEP) |
742 | keylen >>= ASSOC_ARRAY_KEY_CHUNK_SHIFT |
744 | new_s0 = kzalloc - allocate memory. The memory is set to zero.*@size: how many bytes of memory are required.*@flags: the type of memory to allocate (see kmalloc). |
746 | If Not new_s0 Then Return false |
748 | new_meta[2] = assoc_array_shortcut_to_ptr(new_s0) |
750 | to = assoc_array_shortcut_to_ptr(new_s0) |
751 | back_pointer = back_pointer |
752 | parent_slot = parent_slot |
755 | parent_slot = 0 |
757 | parent_slot = -1 |
759 | skip_to_level = level = diff & ~ASSOC_ARRAY_LEVEL_STEP_MASK |
763 | When i < keylen cycle index_key[i] = get_key_chunk(index_key, i * Key data retrieved in chunks of this size ) |
767 | If level & ASSOC_ARRAY_KEY_CHUNK_MASK Then |
768 | blank = ULONG_MAX << (level & ASSOC_ARRAY_KEY_CHUNK_MASK) |
776 | When i < Number of slots per node cycle |
780 | base_seg >>= level & ASSOC_ARRAY_KEY_CHUNK_MASK |
781 | segment_cache[i] = base_seg & ASSOC_ARRAY_FAN_MASK |
784 | base_seg = get_key_chunk(index_key, level) |
785 | base_seg >>= level & ASSOC_ARRAY_KEY_CHUNK_MASK |
787 | Go to do_split_node |
Name | Describe |
---|---|
assoc_array_insert | assoc_array_insert - Script insertion of an object into an associative array*@array: The array to insert into |
Source code conversion tool public plug-in interface | X |
---|---|
Support c/c++/esqlc/java Oracle/Informix/Mysql Plug-in can realize: logical Report Code generation and batch code conversion |