if (walk_state->method_desc) { walk_state->method_desc->method.thread_count--; } acpi_ds_terminate_control_method (walk_state); 
terminate_status = acpi_ds_terminate_control_method(walk_state); if (ACPI_FAILURE(terminate_status)) { ACPI_REPORT_ERROR(("Could not terminate control method properly\n"));  /* Ignore error and continue */ } 
acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state){	acpi_status status;	struct acpi_thread_state *thread;	struct acpi_thread_state *prev_walk_list = acpi_gbl_current_walk_list;	struct acpi_walk_state *previous_walk_state;	ACPI_FUNCTION_TRACE("ps_parse_aml");	ACPI_DEBUG_PRINT((ACPI_DB_PARSE,			  "Entered with walk_state=%p Aml=%p size=%X\n",			  walk_state, walk_state->parser_state.aml,			  walk_state->parser_state.aml_size));	/* Create and initialize a new thread state */	thread = acpi_ut_create_thread_state();	if (!thread) {		return_ACPI_STATUS(AE_NO_MEMORY);	}	walk_state->thread = thread;	acpi_ds_push_walk_state(walk_state, thread);	/*	 * This global allows the AML debugger to get a handle to the currently	 * executing control method.	 */	acpi_gbl_current_walk_list = thread;	/*	 * Execute the walk loop as long as there is a valid Walk State.  This	 * handles nested control method invocations without recursion.	 */	ACPI_DEBUG_PRINT((ACPI_DB_PARSE, "State=%p\n", walk_state));	status = AE_OK;	while (walk_state) {		if (ACPI_SUCCESS(status)) {			/*			 * The parse_loop executes AML until the method terminates			 * or calls another method.			 */			status = acpi_ps_parse_loop(walk_state);		}		ACPI_DEBUG_PRINT((ACPI_DB_PARSE,				  "Completed one call to walk loop, %s State=%p\n",				  acpi_format_exception(status), walk_state));		if (status == AE_CTRL_TRANSFER) {			/*			 * A method call was detected.			 * Transfer control to the called control method			 */			status =			    acpi_ds_call_control_method(thread, walk_state,							NULL);			/*			 * If the transfer to the new method method call worked, a new walk			 * state was created -- get it			 */			walk_state = acpi_ds_get_current_walk_state(thread);			continue;		} else if (status == AE_CTRL_TERMINATE) {			status = AE_OK;		} else if ((status != AE_OK) && (walk_state->method_desc)) {			ACPI_REPORT_METHOD_ERROR("Method execution failed",						 walk_state->method_node, NULL,						 status);			/* Make sure that failed method will be cleaned as if it was executed */			walk_state->parse_flags |= ACPI_PARSE_EXECUTE;						/* Check for possible multi-thread reentrancy problem */			if ((status == AE_ALREADY_EXISTS) &&			    (!walk_state->method_desc->method.semaphore)) {				/*				 * This method is marked not_serialized, but it tried to create				 * a named object, causing the second thread entrance to fail.				 * We will workaround this by marking the method permanently				 * as Serialized.				 */				walk_state->method_desc->method.method_flags |=				    AML_METHOD_SERIALIZED;				walk_state->method_desc->method.concurrency = 1;			}		}		/* We are done with this walk, move on to the parent if any */		walk_state = acpi_ds_pop_walk_state(thread);		/* Reset the current scope to the beginning of scope stack */		acpi_ds_scope_stack_clear(walk_state);		/*		 * If we just returned from the execution of a control method,		 * there's lots of cleanup to do		 */		if ((walk_state->parse_flags & ACPI_PARSE_MODE_MASK) ==		    ACPI_PARSE_EXECUTE) {			if (walk_state->method_desc) {				walk_state->method_desc->method.thread_count--;			}			acpi_ds_terminate_control_method (walk_state);		}		/* Delete this walk state and all linked control states */		acpi_ps_cleanup_scope(&walk_state->parser_state);		previous_walk_state = walk_state;		ACPI_DEBUG_PRINT((ACPI_DB_PARSE,				  "return_value=%p, implicit_value=%p State=%p\n",				  walk_state->return_desc,				  walk_state->implicit_return_obj, walk_state));		/* Check if we have restarted a preempted walk */		walk_state = acpi_ds_get_current_walk_state(thread);		if (walk_state) {			if (ACPI_SUCCESS(status)) {				/*				 * There is another walk state, restart it.				 * If the method return value is not used by the parent,				 * The object is deleted				 */				if (!previous_walk_state->return_desc) {					status =					    acpi_ds_restart_control_method					    (walk_state,					     previous_walk_state->					     implicit_return_obj);				} else {					/*					 * We have a valid return value, delete any implicit					 * return value.					 */					acpi_ds_clear_implicit_return					    (previous_walk_state);					status =					    acpi_ds_restart_control_method					    (walk_state,					     previous_walk_state->return_desc);				}				if (ACPI_SUCCESS(status)) {					walk_state->walk_type |=					    ACPI_WALK_METHOD_RESTART;				}			} else {				/* On error, delete any return object */				acpi_ut_remove_reference(previous_walk_state->							 return_desc);			}		}		/*		 * Just completed a 1st-level method, save the final internal return		 * value (if any)		 */		else if (previous_walk_state->caller_return_desc) {			if (previous_walk_state->implicit_return_obj) {				*(previous_walk_state->caller_return_desc) =				    previous_walk_state->implicit_return_obj;			} else {				/* NULL if no return value */				*(previous_walk_state->caller_return_desc) =				    previous_walk_state->return_desc;			}		} else {			if (previous_walk_state->return_desc) {				/* Caller doesn't want it, must delete it */				acpi_ut_remove_reference(previous_walk_state->							 return_desc);			}			if (previous_walk_state->implicit_return_obj) {				/* Caller doesn't want it, must delete it */				acpi_ut_remove_reference(previous_walk_state->							 implicit_return_obj);			}		}		acpi_ds_delete_walk_state(previous_walk_state);	}	/* Normal exit */	acpi_ex_release_all_mutexes(thread);	acpi_ut_delete_generic_state(ACPI_CAST_PTR				     (union acpi_generic_state, thread));	acpi_gbl_current_walk_list = prev_walk_list;	return_ACPI_STATUS(status);}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/a94f18810f52d3a6de0a09bee0c7258b62eca262/psparse.c/buggy/drivers/acpi/parser/psparse.c