2005-04-17 02:20:36 +04:00
/*******************************************************************************
*
* Module Name : utdelete - object deletion and reference count utilities
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
2006-01-14 00:22:00 +03:00
* Copyright ( C ) 2000 - 2006 , R . Byron Moore
2005-04-17 02:20:36 +04:00
* All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions
* are met :
* 1. Redistributions of source code must retain the above copyright
* notice , this list of conditions , and the following disclaimer ,
* without modification .
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
* substantially similar to the " NO WARRANTY " disclaimer below
* ( " Disclaimer " ) and any redistribution must be conditioned upon
* including a substantially similar Disclaimer requirement for further
* binary redistribution .
* 3. Neither the names of the above - listed copyright holders nor the names
* of any contributors may be used to endorse or promote products derived
* from this software without specific prior written permission .
*
* Alternatively , this software may be distributed under the terms of the
* GNU General Public License ( " GPL " ) version 2 as published by the Free
* Software Foundation .
*
* NO WARRANTY
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* " AS IS " AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT
* LIMITED TO , THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL , EXEMPLARY , OR CONSEQUENTIAL
* DAMAGES ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION )
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT ,
* STRICT LIABILITY , OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES .
*/
# include <acpi/acpi.h>
# include <acpi/acinterp.h>
# include <acpi/acnamesp.h>
# include <acpi/acevents.h>
# include <acpi/amlcode.h>
# define _COMPONENT ACPI_UTILITIES
2005-08-05 08:44:28 +04:00
ACPI_MODULE_NAME ( " utdelete " )
2005-04-17 02:20:36 +04:00
2005-04-19 06:49:35 +04:00
/* Local prototypes */
2005-08-05 08:44:28 +04:00
static void acpi_ut_delete_internal_obj ( union acpi_operand_object * object ) ;
2005-04-19 06:49:35 +04:00
static void
2005-08-05 08:44:28 +04:00
acpi_ut_update_ref_count ( union acpi_operand_object * object , u32 action ) ;
2005-04-17 02:20:36 +04:00
/*******************************************************************************
*
* FUNCTION : acpi_ut_delete_internal_obj
*
2005-04-19 06:49:35 +04:00
* PARAMETERS : Object - Object to be deleted
2005-04-17 02:20:36 +04:00
*
* RETURN : None
*
* DESCRIPTION : Low level object deletion , after reference counts have been
* updated ( All reference counts , including sub - objects ! )
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-08-05 08:44:28 +04:00
static void acpi_ut_delete_internal_obj ( union acpi_operand_object * object )
2005-04-17 02:20:36 +04:00
{
2005-08-05 08:44:28 +04:00
void * obj_pointer = NULL ;
union acpi_operand_object * handler_desc ;
union acpi_operand_object * second_desc ;
union acpi_operand_object * next_desc ;
2005-04-17 02:20:36 +04:00
2005-08-05 08:44:28 +04:00
ACPI_FUNCTION_TRACE_PTR ( " ut_delete_internal_obj " , object ) ;
2005-04-17 02:20:36 +04:00
if ( ! object ) {
return_VOID ;
}
/*
* Must delete or free any pointers within the object that are not
* actual ACPI objects ( for example , a raw buffer pointer ) .
*/
2005-08-05 08:44:28 +04:00
switch ( ACPI_GET_OBJECT_TYPE ( object ) ) {
2005-04-17 02:20:36 +04:00
case ACPI_TYPE_STRING :
2005-08-05 08:44:28 +04:00
ACPI_DEBUG_PRINT ( ( ACPI_DB_ALLOCATIONS ,
" **** String %p, ptr %p \n " , object ,
object - > string . pointer ) ) ;
2005-04-17 02:20:36 +04:00
/* Free the actual string buffer */
if ( ! ( object - > common . flags & AOPOBJ_STATIC_POINTER ) ) {
2006-10-02 08:00:00 +04:00
2005-04-17 02:20:36 +04:00
/* But only if it is NOT a pointer into an ACPI table */
obj_pointer = object - > string . pointer ;
}
break ;
case ACPI_TYPE_BUFFER :
2005-08-05 08:44:28 +04:00
ACPI_DEBUG_PRINT ( ( ACPI_DB_ALLOCATIONS ,
" **** Buffer %p, ptr %p \n " , object ,
object - > buffer . pointer ) ) ;
2005-04-17 02:20:36 +04:00
/* Free the actual buffer */
if ( ! ( object - > common . flags & AOPOBJ_STATIC_POINTER ) ) {
2006-10-02 08:00:00 +04:00
2005-04-17 02:20:36 +04:00
/* But only if it is NOT a pointer into an ACPI table */
obj_pointer = object - > buffer . pointer ;
}
break ;
case ACPI_TYPE_PACKAGE :
2005-08-05 08:44:28 +04:00
ACPI_DEBUG_PRINT ( ( ACPI_DB_ALLOCATIONS ,
" **** Package of count %X \n " ,
object - > package . count ) ) ;
2005-04-17 02:20:36 +04:00
/*
* Elements of the package are not handled here , they are deleted
* separately
*/
/* Free the (variable length) element pointer array */
obj_pointer = object - > package . elements ;
break ;
case ACPI_TYPE_DEVICE :
if ( object - > device . gpe_block ) {
2005-08-05 08:44:28 +04:00
( void ) acpi_ev_delete_gpe_block ( object - > device .
gpe_block ) ;
2005-04-17 02:20:36 +04:00
}
/* Walk the handler list for this device */
handler_desc = object - > device . handler ;
while ( handler_desc ) {
next_desc = handler_desc - > address_space . next ;
2005-08-05 08:44:28 +04:00
acpi_ut_remove_reference ( handler_desc ) ;
2005-04-17 02:20:36 +04:00
handler_desc = next_desc ;
}
break ;
case ACPI_TYPE_MUTEX :
2005-08-05 08:44:28 +04:00
ACPI_DEBUG_PRINT ( ( ACPI_DB_ALLOCATIONS ,
" ***** Mutex %p, Semaphore %p \n " ,
object , object - > mutex . semaphore ) ) ;
2005-04-17 02:20:36 +04:00
2005-08-05 08:44:28 +04:00
acpi_ex_unlink_mutex ( object ) ;
( void ) acpi_os_delete_semaphore ( object - > mutex . semaphore ) ;
2005-04-17 02:20:36 +04:00
break ;
case ACPI_TYPE_EVENT :
2005-08-05 08:44:28 +04:00
ACPI_DEBUG_PRINT ( ( ACPI_DB_ALLOCATIONS ,
" ***** Event %p, Semaphore %p \n " ,
object , object - > event . semaphore ) ) ;
2005-04-17 02:20:36 +04:00
2005-08-05 08:44:28 +04:00
( void ) acpi_os_delete_semaphore ( object - > event . semaphore ) ;
2005-04-17 02:20:36 +04:00
object - > event . semaphore = NULL ;
break ;
case ACPI_TYPE_METHOD :
2005-08-05 08:44:28 +04:00
ACPI_DEBUG_PRINT ( ( ACPI_DB_ALLOCATIONS ,
" ***** Method %p \n " , object ) ) ;
2005-04-17 02:20:36 +04:00
/* Delete the method semaphore if it exists */
if ( object - > method . semaphore ) {
2005-08-05 08:44:28 +04:00
( void ) acpi_os_delete_semaphore ( object - > method .
semaphore ) ;
2005-04-17 02:20:36 +04:00
object - > method . semaphore = NULL ;
}
break ;
case ACPI_TYPE_REGION :
2005-08-05 08:44:28 +04:00
ACPI_DEBUG_PRINT ( ( ACPI_DB_ALLOCATIONS ,
" ***** Region %p \n " , object ) ) ;
2005-04-17 02:20:36 +04:00
2005-08-05 08:44:28 +04:00
second_desc = acpi_ns_get_secondary_object ( object ) ;
2005-04-17 02:20:36 +04:00
if ( second_desc ) {
/*
* Free the region_context if and only if the handler is one of the
* default handlers - - and therefore , we created the context object
* locally , it was not created by an external caller .
*/
handler_desc = object - > region . handler ;
if ( handler_desc ) {
2005-08-05 08:44:28 +04:00
if ( handler_desc - > address_space .
hflags &
ACPI_ADDR_HANDLER_DEFAULT_INSTALLED ) {
obj_pointer =
second_desc - > extra . region_context ;
2005-04-17 02:20:36 +04:00
}
2005-08-05 08:44:28 +04:00
acpi_ut_remove_reference ( handler_desc ) ;
2005-04-17 02:20:36 +04:00
}
/* Now we can free the Extra object */
2005-08-05 08:44:28 +04:00
acpi_ut_delete_object_desc ( second_desc ) ;
2005-04-17 02:20:36 +04:00
}
break ;
case ACPI_TYPE_BUFFER_FIELD :
2005-08-05 08:44:28 +04:00
ACPI_DEBUG_PRINT ( ( ACPI_DB_ALLOCATIONS ,
" ***** Buffer Field %p \n " , object ) ) ;
2005-04-17 02:20:36 +04:00
2005-08-05 08:44:28 +04:00
second_desc = acpi_ns_get_secondary_object ( object ) ;
2005-04-17 02:20:36 +04:00
if ( second_desc ) {
2005-08-05 08:44:28 +04:00
acpi_ut_delete_object_desc ( second_desc ) ;
2005-04-17 02:20:36 +04:00
}
break ;
default :
break ;
}
/* Free any allocated memory (pointer within the object) found above */
if ( obj_pointer ) {
2005-08-05 08:44:28 +04:00
ACPI_DEBUG_PRINT ( ( ACPI_DB_ALLOCATIONS ,
" Deleting Object Subptr %p \n " , obj_pointer ) ) ;
ACPI_MEM_FREE ( obj_pointer ) ;
2005-04-17 02:20:36 +04:00
}
/* Now the object can be safely deleted */
2005-08-05 08:44:28 +04:00
ACPI_DEBUG_PRINT ( ( ACPI_DB_ALLOCATIONS , " Deleting Object %p [%s] \n " ,
object , acpi_ut_get_object_type_name ( object ) ) ) ;
2005-04-17 02:20:36 +04:00
2005-08-05 08:44:28 +04:00
acpi_ut_delete_object_desc ( object ) ;
2005-04-17 02:20:36 +04:00
return_VOID ;
}
/*******************************************************************************
*
* FUNCTION : acpi_ut_delete_internal_object_list
*
2005-04-19 06:49:35 +04:00
* PARAMETERS : obj_list - Pointer to the list to be deleted
2005-04-17 02:20:36 +04:00
*
* RETURN : None
*
* DESCRIPTION : This function deletes an internal object list , including both
* simple objects and package objects
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-08-05 08:44:28 +04:00
void acpi_ut_delete_internal_object_list ( union acpi_operand_object * * obj_list )
2005-04-17 02:20:36 +04:00
{
2005-08-05 08:44:28 +04:00
union acpi_operand_object * * internal_obj ;
2005-04-17 02:20:36 +04:00
2005-08-05 08:44:28 +04:00
ACPI_FUNCTION_TRACE ( " ut_delete_internal_object_list " ) ;
2005-04-17 02:20:36 +04:00
/* Walk the null-terminated internal list */
for ( internal_obj = obj_list ; * internal_obj ; internal_obj + + ) {
2005-08-05 08:44:28 +04:00
acpi_ut_remove_reference ( * internal_obj ) ;
2005-04-17 02:20:36 +04:00
}
/* Free the combined parameter pointer list and object array */
2005-08-05 08:44:28 +04:00
ACPI_MEM_FREE ( obj_list ) ;
2005-04-17 02:20:36 +04:00
return_VOID ;
}
/*******************************************************************************
*
* FUNCTION : acpi_ut_update_ref_count
*
2005-04-19 06:49:35 +04:00
* PARAMETERS : Object - Object whose ref count is to be updated
2005-04-17 02:20:36 +04:00
* Action - What to do
*
* RETURN : New ref count
*
* DESCRIPTION : Modify the ref count and return it .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void
2005-08-05 08:44:28 +04:00
acpi_ut_update_ref_count ( union acpi_operand_object * object , u32 action )
2005-04-17 02:20:36 +04:00
{
2005-08-05 08:44:28 +04:00
u16 count ;
u16 new_count ;
2005-04-17 02:20:36 +04:00
2005-08-05 08:44:28 +04:00
ACPI_FUNCTION_NAME ( " ut_update_ref_count " ) ;
2005-04-17 02:20:36 +04:00
if ( ! object ) {
return ;
}
count = object - > common . reference_count ;
new_count = count ;
/*
2005-04-19 06:49:35 +04:00
* Perform the reference count action
* ( increment , decrement , or force delete )
2005-04-17 02:20:36 +04:00
*/
switch ( action ) {
case REF_INCREMENT :
new_count + + ;
object - > common . reference_count = new_count ;
2005-08-05 08:44:28 +04:00
ACPI_DEBUG_PRINT ( ( ACPI_DB_ALLOCATIONS ,
" Obj %p Refs=%X, [Incremented] \n " ,
object , new_count ) ) ;
2005-04-17 02:20:36 +04:00
break ;
case REF_DECREMENT :
if ( count < 1 ) {
2005-08-05 08:44:28 +04:00
ACPI_DEBUG_PRINT ( ( ACPI_DB_ALLOCATIONS ,
" Obj %p Refs=%X, can't decrement! (Set to 0) \n " ,
object , new_count ) ) ;
2005-04-17 02:20:36 +04:00
new_count = 0 ;
2005-08-05 08:44:28 +04:00
} else {
2005-04-17 02:20:36 +04:00
new_count - - ;
2005-08-05 08:44:28 +04:00
ACPI_DEBUG_PRINT ( ( ACPI_DB_ALLOCATIONS ,
" Obj %p Refs=%X, [Decremented] \n " ,
object , new_count ) ) ;
2005-04-17 02:20:36 +04:00
}
2005-08-05 08:44:28 +04:00
if ( ACPI_GET_OBJECT_TYPE ( object ) = = ACPI_TYPE_METHOD ) {
ACPI_DEBUG_PRINT ( ( ACPI_DB_ALLOCATIONS ,
" Method Obj %p Refs=%X, [Decremented] \n " ,
object , new_count ) ) ;
2005-04-17 02:20:36 +04:00
}
object - > common . reference_count = new_count ;
if ( new_count = = 0 ) {
2005-08-05 08:44:28 +04:00
acpi_ut_delete_internal_obj ( object ) ;
2005-04-17 02:20:36 +04:00
}
break ;
case REF_FORCE_DELETE :
2005-08-05 08:44:28 +04:00
ACPI_DEBUG_PRINT ( ( ACPI_DB_ALLOCATIONS ,
" Obj %p Refs=%X, Force delete! (Set to 0) \n " ,
object , count ) ) ;
2005-04-17 02:20:36 +04:00
new_count = 0 ;
object - > common . reference_count = new_count ;
2005-08-05 08:44:28 +04:00
acpi_ut_delete_internal_obj ( object ) ;
2005-04-17 02:20:36 +04:00
break ;
default :
2006-01-28 00:43:00 +03:00
ACPI_ERROR ( ( AE_INFO , " Unknown action (%X) " , action ) ) ;
2005-04-17 02:20:36 +04:00
break ;
}
/*
* Sanity check the reference count , for debug purposes only .
* ( A deleted object will have a huge reference count )
*/
if ( count > ACPI_MAX_REFERENCE_COUNT ) {
2006-01-28 00:43:00 +03:00
ACPI_WARNING ( ( AE_INFO ,
" Large Reference Count (%X) in object %p " ,
count , object ) ) ;
2005-04-17 02:20:36 +04:00
}
return ;
}
/*******************************************************************************
*
* FUNCTION : acpi_ut_update_object_reference
*
2005-04-19 06:49:35 +04:00
* PARAMETERS : Object - Increment ref count for this object
2005-04-17 02:20:36 +04:00
* and all sub - objects
* Action - Either REF_INCREMENT or REF_DECREMENT or
* REF_FORCE_DELETE
*
* RETURN : Status
*
* DESCRIPTION : Increment the object reference count
*
* Object references are incremented when :
* 1 ) An object is attached to a Node ( namespace object )
* 2 ) An object is copied ( all subobjects must be incremented )
*
* Object references are decremented when :
* 1 ) An object is detached from an Node
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
acpi_status
2005-08-05 08:44:28 +04:00
acpi_ut_update_object_reference ( union acpi_operand_object * object , u16 action )
2005-04-17 02:20:36 +04:00
{
2005-08-05 08:44:28 +04:00
acpi_status status = AE_OK ;
union acpi_generic_state * state_list = NULL ;
union acpi_operand_object * next_object = NULL ;
union acpi_generic_state * state ;
acpi_native_uint i ;
2005-04-17 02:20:36 +04:00
2005-08-05 08:44:28 +04:00
ACPI_FUNCTION_TRACE_PTR ( " ut_update_object_reference " , object ) ;
2005-04-17 02:20:36 +04:00
2005-07-08 08:00:00 +04:00
while ( object ) {
2006-10-02 08:00:00 +04:00
2005-07-08 08:00:00 +04:00
/* Make sure that this isn't a namespace handle */
2005-04-17 02:20:36 +04:00
2005-08-05 08:44:28 +04:00
if ( ACPI_GET_DESCRIPTOR_TYPE ( object ) = = ACPI_DESC_TYPE_NAMED ) {
ACPI_DEBUG_PRINT ( ( ACPI_DB_ALLOCATIONS ,
" Object %p is NS handle \n " , object ) ) ;
return_ACPI_STATUS ( AE_OK ) ;
2005-07-08 08:00:00 +04:00
}
2005-04-17 02:20:36 +04:00
/*
* All sub - objects must have their reference count incremented also .
* Different object types have different subobjects .
*/
2005-08-05 08:44:28 +04:00
switch ( ACPI_GET_OBJECT_TYPE ( object ) ) {
2005-04-17 02:20:36 +04:00
case ACPI_TYPE_DEVICE :
2005-08-05 08:44:28 +04:00
acpi_ut_update_ref_count ( object - > device . system_notify ,
action ) ;
acpi_ut_update_ref_count ( object - > device . device_notify ,
action ) ;
2005-04-17 02:20:36 +04:00
break ;
case ACPI_TYPE_PACKAGE :
/*
2005-07-08 08:00:00 +04:00
* We must update all the sub - objects of the package ,
* each of whom may have their own sub - objects .
2005-04-17 02:20:36 +04:00
*/
for ( i = 0 ; i < object - > package . count ; i + + ) {
/*
* Push each element onto the stack for later processing .
* Note : There can be null elements within the package ,
* these are simply ignored
*/
2005-08-05 08:44:28 +04:00
status =
acpi_ut_create_update_state_and_push
( object - > package . elements [ i ] , action ,
& state_list ) ;
if ( ACPI_FAILURE ( status ) ) {
2005-04-17 02:20:36 +04:00
goto error_exit ;
}
}
break ;
case ACPI_TYPE_BUFFER_FIELD :
2005-07-08 08:00:00 +04:00
next_object = object - > buffer_field . buffer_obj ;
2005-04-17 02:20:36 +04:00
break ;
case ACPI_TYPE_LOCAL_REGION_FIELD :
2005-07-08 08:00:00 +04:00
next_object = object - > field . region_obj ;
break ;
2005-04-17 02:20:36 +04:00
case ACPI_TYPE_LOCAL_BANK_FIELD :
2005-07-08 08:00:00 +04:00
next_object = object - > bank_field . bank_obj ;
2005-08-05 08:44:28 +04:00
status =
acpi_ut_create_update_state_and_push ( object - >
bank_field .
region_obj ,
action ,
& state_list ) ;
if ( ACPI_FAILURE ( status ) ) {
2005-04-17 02:20:36 +04:00
goto error_exit ;
}
break ;
case ACPI_TYPE_LOCAL_INDEX_FIELD :
2005-07-08 08:00:00 +04:00
next_object = object - > index_field . index_obj ;
2005-08-05 08:44:28 +04:00
status =
acpi_ut_create_update_state_and_push ( object - >
index_field .
data_obj ,
action ,
& state_list ) ;
if ( ACPI_FAILURE ( status ) ) {
2005-04-17 02:20:36 +04:00
goto error_exit ;
}
break ;
case ACPI_TYPE_LOCAL_REFERENCE :
/*
* The target of an Index ( a package , string , or buffer ) must track
* changes to the ref count of the index .
*/
if ( object - > reference . opcode = = AML_INDEX_OP ) {
2005-07-08 08:00:00 +04:00
next_object = object - > reference . object ;
2005-04-17 02:20:36 +04:00
}
break ;
case ACPI_TYPE_REGION :
default :
2005-08-05 08:44:28 +04:00
break ; /* No subobjects */
2005-04-17 02:20:36 +04:00
}
/*
* Now we can update the count in the main object . This can only
* happen after we update the sub - objects in case this causes the
* main object to be deleted .
*/
2005-08-05 08:44:28 +04:00
acpi_ut_update_ref_count ( object , action ) ;
2005-07-08 08:00:00 +04:00
object = NULL ;
2005-04-17 02:20:36 +04:00
/* Move on to the next object to be updated */
2005-07-08 08:00:00 +04:00
if ( next_object ) {
object = next_object ;
next_object = NULL ;
2005-08-05 08:44:28 +04:00
} else if ( state_list ) {
state = acpi_ut_pop_generic_state ( & state_list ) ;
2005-07-08 08:00:00 +04:00
object = state - > update . object ;
2005-08-05 08:44:28 +04:00
acpi_ut_delete_generic_state ( state ) ;
2005-07-08 08:00:00 +04:00
}
2005-04-17 02:20:36 +04:00
}
2005-08-05 08:44:28 +04:00
return_ACPI_STATUS ( AE_OK ) ;
2005-04-17 02:20:36 +04:00
2005-08-05 08:44:28 +04:00
error_exit :
2005-04-17 02:20:36 +04:00
2006-01-28 00:43:00 +03:00
ACPI_EXCEPTION ( ( AE_INFO , status ,
" Could not update object reference count " ) ) ;
2005-04-17 02:20:36 +04:00
2005-08-05 08:44:28 +04:00
return_ACPI_STATUS ( status ) ;
2005-04-17 02:20:36 +04:00
}
/*******************************************************************************
*
* FUNCTION : acpi_ut_add_reference
*
2005-04-19 06:49:35 +04:00
* PARAMETERS : Object - Object whose reference count is to be
* incremented
2005-04-17 02:20:36 +04:00
*
* RETURN : None
*
* DESCRIPTION : Add one reference to an ACPI object
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-08-05 08:44:28 +04:00
void acpi_ut_add_reference ( union acpi_operand_object * object )
2005-04-17 02:20:36 +04:00
{
2005-08-05 08:44:28 +04:00
ACPI_FUNCTION_TRACE_PTR ( " ut_add_reference " , object ) ;
2005-04-17 02:20:36 +04:00
/* Ensure that we have a valid object */
2005-08-05 08:44:28 +04:00
if ( ! acpi_ut_valid_internal_object ( object ) ) {
2005-04-17 02:20:36 +04:00
return_VOID ;
}
2005-08-05 08:44:28 +04:00
ACPI_DEBUG_PRINT ( ( ACPI_DB_ALLOCATIONS ,
" Obj %p Current Refs=%X [To Be Incremented] \n " ,
object , object - > common . reference_count ) ) ;
2005-04-17 02:20:36 +04:00
/* Increment the reference count */
2005-08-05 08:44:28 +04:00
( void ) acpi_ut_update_object_reference ( object , REF_INCREMENT ) ;
2005-04-17 02:20:36 +04:00
return_VOID ;
}
/*******************************************************************************
*
* FUNCTION : acpi_ut_remove_reference
*
2005-04-19 06:49:35 +04:00
* PARAMETERS : Object - Object whose ref count will be decremented
2005-04-17 02:20:36 +04:00
*
* RETURN : None
*
* DESCRIPTION : Decrement the reference count of an ACPI internal object
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-08-05 08:44:28 +04:00
void acpi_ut_remove_reference ( union acpi_operand_object * object )
2005-04-17 02:20:36 +04:00
{
2005-08-05 08:44:28 +04:00
ACPI_FUNCTION_TRACE_PTR ( " ut_remove_reference " , object ) ;
2005-04-17 02:20:36 +04:00
/*
* Allow a NULL pointer to be passed in , just ignore it . This saves
* each caller from having to check . Also , ignore NS nodes .
*
*/
if ( ! object | |
2005-08-05 08:44:28 +04:00
( ACPI_GET_DESCRIPTOR_TYPE ( object ) = = ACPI_DESC_TYPE_NAMED ) ) {
2005-04-17 02:20:36 +04:00
return_VOID ;
}
/* Ensure that we have a valid object */
2005-08-05 08:44:28 +04:00
if ( ! acpi_ut_valid_internal_object ( object ) ) {
2005-04-17 02:20:36 +04:00
return_VOID ;
}
2005-08-05 08:44:28 +04:00
ACPI_DEBUG_PRINT ( ( ACPI_DB_ALLOCATIONS ,
" Obj %p Current Refs=%X [To Be Decremented] \n " ,
object , object - > common . reference_count ) ) ;
2005-04-17 02:20:36 +04:00
/*
* Decrement the reference count , and only actually delete the object
* if the reference count becomes 0. ( Must also decrement the ref count
* of all subobjects ! )
*/
2005-08-05 08:44:28 +04:00
( void ) acpi_ut_update_object_reference ( object , REF_DECREMENT ) ;
2005-04-17 02:20:36 +04:00
return_VOID ;
}