Function report |
Source Code:lib\assoc_array.c |
Create Date:2022-07-28 06:54:40 |
| Last Modify:2020-03-12 14:18:49 | Copyright©Brick |
| home page | Tree |
| Annotation kernel can get tool activity | Download SCCT | Chinese |
Name:assoc_array_gc - Garbage collect an associative array
Proto:int assoc_array_gc(struct assoc_array *array, const struct assoc_array_ops *ops, bool (*iterator)(void *object, void *iterator_data), void *iterator_data)
Type:int
Parameter:
| Type | Parameter | Name |
|---|---|---|
| struct assoc_array * | array | |
| const struct assoc_array_ops * | ops | |
| bool (* | iterator | |
| void * | iterator_data |
| 1469 | If Not The node at the root of the tree Then Return 0 |
| 1472 | edit = 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). |
| 1477 | ops_for_excised_subtree = ops |
| 1481 | new_root = new_parent = NULL |
| 1482 | new_ptr_pp = new_root |
| 1485 | descend : |
| 1489 | If assoc_array_ptr_is_shortcut(cursor) Then |
| 1492 | keylen >>= ASSOC_ARRAY_KEY_CHUNK_SHIFT |
| 1493 | new_s = kmalloc(sizeof(structassoc_array_shortcut) + keylen * sizeof(unsignedlong), GFP_KERNEL) |
| 1498 | No 3D Now!(new_s, shortcut, (sizeof(structassoc_array_shortcut) + keylen * sizeof(unsignedlong))) |
| 1500 | back_pointer = new_parent |
| 1501 | parent_slot = parent_slot |
| 1502 | new_ptr_pp = new_parent = assoc_array_shortcut_to_ptr(new_s) |
| 1503 | new_ptr_pp = next_node |
| 1508 | node = assoc_array_ptr_to_node(cursor) |
| 1509 | new_n = 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). |
| 1513 | back_pointer = new_parent |
| 1514 | parent_slot = parent_slot |
| 1515 | new_ptr_pp = new_parent = assoc_array_node_to_ptr(new_n) |
| 1516 | new_ptr_pp = NULL |
| 1517 | slot = 0 |
| 1519 | continue_node : |
| 1521 | When slot < Number of slots per node cycle |
| 1523 | If Not ptr Then Continue |
| 1526 | If assoc_array_ptr_is_leaf(ptr) Then |
| 1527 | If iterator(assoc_array_ptr_to_leaf(ptr), iterator_data) Then slots[slot] = ptr |
| 1533 | Continue |
| 1536 | new_ptr_pp = slots[slot] |
| 1538 | Go to descend |
| 1546 | nr_leaves_on_branch = 0 |
| 1547 | nr_free = 0 |
| 1548 | When slot < Number of slots per node cycle |
| 1552 | Else if assoc_array_ptr_is_leaf(ptr) Then nr_leaves_on_branch++ |
| 1555 | pr_devel("free=%d, leaves=%lu\n", nr_free, nr_leaves_on_branch) |
| 1558 | next_slot = 0 |
| 1559 | When slot < Number of slots per node cycle |
| 1564 | If Not ptr || assoc_array_ptr_is_leaf(ptr) Then Continue |
| 1567 | s = NULL |
| 1568 | If assoc_array_ptr_is_shortcut(ptr) Then |
| 1569 | s = assoc_array_ptr_to_shortcut(ptr) |
| 1573 | child = assoc_array_ptr_to_node(ptr) |
| 1576 | If nr_leaves_on_branch <= nr_free + 1 Then |
| 1578 | pr_devel("[%d] fold node %lu/%d [nx %d]\n", slot, nr_leaves_on_branch, nr_free + 1, next_slot) |
| 1588 | nr_free++ |
| 1591 | When i < Number of slots per node cycle |
| 1593 | If Not p Then Continue |
| 1595 | BUG_ON(assoc_array_ptr_is_meta(p)) |
| 1597 | next_slot++ |
| 1598 | BUG_ON(next_slot >= Number of slots per node ) |
| 1600 | nr_free-- |
| 1603 | Else |
| 1604 | pr_devel("[%d] retain node %lu/%d [nx %d]\n", slot, nr_leaves_on_branch, nr_free + 1, next_slot) |
| 1610 | pr_devel("after: %lu\n", nr_leaves_on_branch) |
| 1615 | If nr_free == Number of slots per node - 1 Then |
| 1618 | Break |
| 1620 | If assoc_array_ptr_is_meta(ptr) && assoc_array_ptr_is_shortcut(ptr) Then |
| 1623 | new_s = assoc_array_ptr_to_shortcut(ptr) |
| 1624 | new_parent = back_pointer |
| 1625 | slot = parent_slot |
| 1627 | If Not new_parent Then |
| 1634 | If assoc_array_ptr_is_shortcut(new_parent) Then |
| 1636 | s = assoc_array_ptr_to_shortcut(new_parent) |
| 1639 | pr_devel("excise preceding shortcut\n") |
| 1641 | new_parent = back_pointer = back_pointer |
| 1642 | slot = parent_slot = parent_slot |
| 1644 | If Not new_parent Then |
| 1652 | back_pointer = new_parent |
| 1653 | parent_slot = slot |
| 1654 | new_n = assoc_array_ptr_to_node(new_parent) |
| 1656 | Go to ascend_old_tree |
| 1663 | ptr = back_pointer |
| 1664 | If Not ptr Then Go to gc_complete |
| 1667 | If assoc_array_ptr_is_shortcut(ptr) Then |
| 1668 | new_s = assoc_array_ptr_to_shortcut(ptr) |
| 1669 | new_parent = back_pointer |
| 1670 | slot = parent_slot |
| 1672 | If nr_leaves_on_branch <= Number of slots per node Then |
| 1675 | pr_devel("excise shortcut\n") |
| 1676 | back_pointer = new_parent |
| 1677 | parent_slot = slot |
| 1679 | If Not new_parent Then |
| 1680 | new_root = assoc_array_node_to_ptr(new_n) |
| 1681 | Go to gc_complete |
| 1684 | n = assoc_array_ptr_to_node(new_parent) |
| 1685 | slots[slot] = assoc_array_node_to_ptr(new_n) |
| 1687 | Else |
| 1688 | new_parent = ptr |
| 1690 | new_n = assoc_array_ptr_to_node(new_parent) |
| 1692 | ascend_old_tree : |
| 1693 | ptr = back_pointer |
| 1694 | If assoc_array_ptr_is_shortcut(ptr) Then |
| 1695 | shortcut = assoc_array_ptr_to_shortcut(ptr) |
| 1696 | slot = parent_slot |
| 1697 | cursor = back_pointer |
| 1698 | If Not cursor Then Go to gc_complete |
| 1700 | Else |
| 1701 | slot = parent_slot |
| 1705 | node = assoc_array_ptr_to_node(cursor) |
| 1706 | slot++ |
| 1707 | Go to continue_node |
| 1709 | gc_complete : |
| 1713 | Return 0 |
| 1715 | enomem : |
| 1716 | pr_devel("enomem\n") |
| 1719 | Return -ENOMEM |
| 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 |