📄 nsobject.c
字号:
* * RETURN: None. * * DESCRIPTION: Detach/delete an object associated with a namespace node. * if the object is an allocated object, it is freed. * Otherwise, the field is simply cleared. * ******************************************************************************/voidAcpiNsDetachObject ( ACPI_NAMESPACE_NODE *Node){ ACPI_OPERAND_OBJECT *ObjDesc; ACPI_FUNCTION_TRACE (NsDetachObject); ObjDesc = Node->Object; if (!ObjDesc || (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_LOCAL_DATA)) { return_VOID; } /* Clear the entry in all cases */ Node->Object = NULL; if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_OPERAND) { Node->Object = ObjDesc->Common.NextObject; if (Node->Object && (ACPI_GET_OBJECT_TYPE (Node->Object) != ACPI_TYPE_LOCAL_DATA)) { Node->Object = Node->Object->Common.NextObject; } } /* Reset the node type to untyped */ Node->Type = ACPI_TYPE_ANY; ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Node %p [%4.4s] Object %p\n", Node, AcpiUtGetNodeName (Node), ObjDesc)); /* Remove one reference on the object (and all subobjects) */ AcpiUtRemoveReference (ObjDesc); return_VOID;}/******************************************************************************* * * FUNCTION: AcpiNsGetAttachedObject * * PARAMETERS: Node - Namespace node * * RETURN: Current value of the object field from the Node whose * handle is passed * * DESCRIPTION: Obtain the object attached to a namespace node. * ******************************************************************************/ACPI_OPERAND_OBJECT *AcpiNsGetAttachedObject ( ACPI_NAMESPACE_NODE *Node){ ACPI_FUNCTION_TRACE_PTR (NsGetAttachedObject, Node); if (!Node) { ACPI_WARNING ((AE_INFO, "Null Node ptr")); return_PTR (NULL); } if (!Node->Object || ((ACPI_GET_DESCRIPTOR_TYPE (Node->Object) != ACPI_DESC_TYPE_OPERAND) && (ACPI_GET_DESCRIPTOR_TYPE (Node->Object) != ACPI_DESC_TYPE_NAMED)) || (ACPI_GET_OBJECT_TYPE (Node->Object) == ACPI_TYPE_LOCAL_DATA)) { return_PTR (NULL); } return_PTR (Node->Object);}/******************************************************************************* * * FUNCTION: AcpiNsGetSecondaryObject * * PARAMETERS: Node - Namespace node * * RETURN: Current value of the object field from the Node whose * handle is passed. * * DESCRIPTION: Obtain a secondary object associated with a namespace node. * ******************************************************************************/ACPI_OPERAND_OBJECT *AcpiNsGetSecondaryObject ( ACPI_OPERAND_OBJECT *ObjDesc){ ACPI_FUNCTION_TRACE_PTR (NsGetSecondaryObject, ObjDesc); if ((!ObjDesc) || (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_LOCAL_DATA) || (!ObjDesc->Common.NextObject) || (ACPI_GET_OBJECT_TYPE (ObjDesc->Common.NextObject) == ACPI_TYPE_LOCAL_DATA)) { return_PTR (NULL); } return_PTR (ObjDesc->Common.NextObject);}/******************************************************************************* * * FUNCTION: AcpiNsAttachData * * PARAMETERS: Node - Namespace node * Handler - Handler to be associated with the data * Data - Data to be attached * * RETURN: Status * * DESCRIPTION: Low-level attach data. Create and attach a Data object. * ******************************************************************************/ACPI_STATUSAcpiNsAttachData ( ACPI_NAMESPACE_NODE *Node, ACPI_OBJECT_HANDLER Handler, void *Data){ ACPI_OPERAND_OBJECT *PrevObjDesc; ACPI_OPERAND_OBJECT *ObjDesc; ACPI_OPERAND_OBJECT *DataDesc; /* We only allow one attachment per handler */ PrevObjDesc = NULL; ObjDesc = Node->Object; while (ObjDesc) { if ((ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_LOCAL_DATA) && (ObjDesc->Data.Handler == Handler)) { return (AE_ALREADY_EXISTS); } PrevObjDesc = ObjDesc; ObjDesc = ObjDesc->Common.NextObject; } /* Create an internal object for the data */ DataDesc = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_DATA); if (!DataDesc) { return (AE_NO_MEMORY); } DataDesc->Data.Handler = Handler; DataDesc->Data.Pointer = Data; /* Install the data object */ if (PrevObjDesc) { PrevObjDesc->Common.NextObject = DataDesc; } else { Node->Object = DataDesc; } return (AE_OK);}/******************************************************************************* * * FUNCTION: AcpiNsDetachData * * PARAMETERS: Node - Namespace node * Handler - Handler associated with the data * * RETURN: Status * * DESCRIPTION: Low-level detach data. Delete the data node, but the caller * is responsible for the actual data. * ******************************************************************************/ACPI_STATUSAcpiNsDetachData ( ACPI_NAMESPACE_NODE *Node, ACPI_OBJECT_HANDLER Handler){ ACPI_OPERAND_OBJECT *ObjDesc; ACPI_OPERAND_OBJECT *PrevObjDesc; PrevObjDesc = NULL; ObjDesc = Node->Object; while (ObjDesc) { if ((ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_LOCAL_DATA) && (ObjDesc->Data.Handler == Handler)) { if (PrevObjDesc) { PrevObjDesc->Common.NextObject = ObjDesc->Common.NextObject; } else { Node->Object = ObjDesc->Common.NextObject; } AcpiUtRemoveReference (ObjDesc); return (AE_OK); } PrevObjDesc = ObjDesc; ObjDesc = ObjDesc->Common.NextObject; } return (AE_NOT_FOUND);}/******************************************************************************* * * FUNCTION: AcpiNsGetAttachedData * * PARAMETERS: Node - Namespace node * Handler - Handler associated with the data * Data - Where the data is returned * * RETURN: Status * * DESCRIPTION: Low level interface to obtain data previously associated with * a namespace node. * ******************************************************************************/ACPI_STATUSAcpiNsGetAttachedData ( ACPI_NAMESPACE_NODE *Node, ACPI_OBJECT_HANDLER Handler, void **Data){ ACPI_OPERAND_OBJECT *ObjDesc; ObjDesc = Node->Object; while (ObjDesc) { if ((ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_LOCAL_DATA) && (ObjDesc->Data.Handler == Handler)) { *Data = ObjDesc->Data.Pointer; return (AE_OK); } ObjDesc = ObjDesc->Common.NextObject; } return (AE_NOT_FOUND);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -