⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nsalloc.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 2 页
字号:
        Node->Peer = ParentNode;    }    /* Init the new entry */    Node->OwnerId = OwnerId;    Node->Type = (UINT8) Type;    ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,        "%4.4s (%s) [Node %p Owner %X] added to %4.4s (%s) [Node %p]\n",        AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type), Node, OwnerId,        AcpiUtGetNodeName (ParentNode), AcpiUtGetTypeName (ParentNode->Type),        ParentNode));    return_VOID;}/******************************************************************************* * * FUNCTION:    AcpiNsDeleteChildren * * PARAMETERS:  ParentNode      - Delete this objects children * * RETURN:      None. * * DESCRIPTION: Delete all children of the parent object. In other words, *              deletes a "scope". * ******************************************************************************/voidAcpiNsDeleteChildren (    ACPI_NAMESPACE_NODE     *ParentNode){    ACPI_NAMESPACE_NODE     *ChildNode;    ACPI_NAMESPACE_NODE     *NextNode;    UINT8                   Flags;    ACPI_FUNCTION_TRACE_PTR (NsDeleteChildren, ParentNode);    if (!ParentNode)    {        return_VOID;    }    /* If no children, all done! */    ChildNode = ParentNode->Child;    if (!ChildNode)    {        return_VOID;    }    /*     * Deallocate all children at this level     */    do    {        /* Get the things we need */        NextNode = ChildNode->Peer;        Flags = ChildNode->Flags;        /* Grandchildren should have all been deleted already */        if (ChildNode->Child)        {            ACPI_ERROR ((AE_INFO, "Found a grandchild! P=%p C=%p",                ParentNode, ChildNode));        }        /* Now we can free this child object */        ACPI_MEM_TRACKING (AcpiGbl_NsNodeList->TotalFreed++);        ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "Object %p, Remaining %X\n",            ChildNode, AcpiGbl_CurrentNodeCount));        /*         * Detach an object if there is one, then free the child node         */        AcpiNsDetachObject (ChildNode);        /* Now we can delete the node */        (void) AcpiOsReleaseObject (AcpiGbl_NamespaceCache, ChildNode);        /* And move on to the next child in the list */        ChildNode = NextNode;    } while (!(Flags & ANOBJ_END_OF_PEER_LIST));    /* Clear the parent's child pointer */    ParentNode->Child = NULL;    return_VOID;}/******************************************************************************* * * FUNCTION:    AcpiNsDeleteNamespaceSubtree * * PARAMETERS:  ParentNode      - Root of the subtree to be deleted * * RETURN:      None. * * DESCRIPTION: Delete a subtree of the namespace.  This includes all objects *              stored within the subtree. * ******************************************************************************/voidAcpiNsDeleteNamespaceSubtree (    ACPI_NAMESPACE_NODE     *ParentNode){    ACPI_NAMESPACE_NODE     *ChildNode = NULL;    UINT32                  Level = 1;    ACPI_FUNCTION_TRACE (NsDeleteNamespaceSubtree);    if (!ParentNode)    {        return_VOID;    }    /*     * Traverse the tree of objects until we bubble back up     * to where we started.     */    while (Level > 0)    {        /* Get the next node in this scope (NULL if none) */        ChildNode = AcpiNsGetNextNode (ACPI_TYPE_ANY, ParentNode, ChildNode);        if (ChildNode)        {            /* Found a child node - detach any attached object */            AcpiNsDetachObject (ChildNode);            /* Check if this node has any children */            if (AcpiNsGetNextNode (ACPI_TYPE_ANY, ChildNode, NULL))            {                /*                 * There is at least one child of this node,                 * visit the node                 */                Level++;                ParentNode = ChildNode;                ChildNode  = NULL;            }        }        else        {            /*             * No more children of this parent node.             * Move up to the grandparent.             */            Level--;            /*             * Now delete all of the children of this parent             * all at the same time.             */            AcpiNsDeleteChildren (ParentNode);            /* New "last child" is this parent node */            ChildNode = ParentNode;            /* Move up the tree to the grandparent */            ParentNode = AcpiNsGetParentNode (ParentNode);        }    }    return_VOID;}/******************************************************************************* * * FUNCTION:    AcpiNsDeleteNamespaceByOwner * * PARAMETERS:  OwnerId     - All nodes with this owner will be deleted * * RETURN:      Status * * DESCRIPTION: Delete entries within the namespace that are owned by a *              specific ID.  Used to delete entire ACPI tables.  All *              reference counts are updated. * * MUTEX:       Locks namespace during deletion walk. * ******************************************************************************/voidAcpiNsDeleteNamespaceByOwner (    ACPI_OWNER_ID            OwnerId){    ACPI_NAMESPACE_NODE     *ChildNode;    ACPI_NAMESPACE_NODE     *DeletionNode;    ACPI_NAMESPACE_NODE     *ParentNode;    UINT32                  Level;    ACPI_STATUS             Status;    ACPI_FUNCTION_TRACE_U32 (NsDeleteNamespaceByOwner, OwnerId);    if (OwnerId == 0)    {        return_VOID;    }    /* Lock namespace for possible update */    Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);    if (ACPI_FAILURE (Status))    {        return_VOID;    }    DeletionNode = NULL;    ParentNode = AcpiGbl_RootNode;    ChildNode = NULL;    Level = 1;    /*     * Traverse the tree of nodes until we bubble back up     * to where we started.     */    while (Level > 0)    {        /*         * Get the next child of this parent node. When ChildNode is NULL,         * the first child of the parent is returned         */        ChildNode = AcpiNsGetNextNode (ACPI_TYPE_ANY, ParentNode, ChildNode);        if (DeletionNode)        {            AcpiNsDeleteChildren (DeletionNode);            AcpiNsDeleteNode (DeletionNode);            DeletionNode = NULL;        }        if (ChildNode)        {            if (ChildNode->OwnerId == OwnerId)            {                /* Found a matching child node - detach any attached object */                AcpiNsDetachObject (ChildNode);            }            /* Check if this node has any children */            if (AcpiNsGetNextNode (ACPI_TYPE_ANY, ChildNode, NULL))            {                /*                 * There is at least one child of this node,                 * visit the node                 */                Level++;                ParentNode = ChildNode;                ChildNode  = NULL;            }            else if (ChildNode->OwnerId == OwnerId)            {                DeletionNode = ChildNode;            }        }        else        {            /*             * No more children of this parent node.             * Move up to the grandparent.             */            Level--;            if (Level != 0)            {                if (ParentNode->OwnerId == OwnerId)                {                    DeletionNode = ParentNode;                }            }            /* New "last child" is this parent node */            ChildNode = ParentNode;            /* Move up the tree to the grandparent */            ParentNode = AcpiNsGetParentNode (ParentNode);        }    }    (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);    return_VOID;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -