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

📄 utalloc.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
		return (NULL);	}	status = acpi_ut_track_allocation(allocation, size,					  ACPI_MEM_MALLOC, component, module,					  line);	if (ACPI_FAILURE(status)) {		acpi_os_free(allocation);		return (NULL);	}	acpi_gbl_global_list->total_allocated++;	acpi_gbl_global_list->current_total_size += (u32) size;	return ((void *)&allocation->user_space);}/******************************************************************************* * * FUNCTION:    acpi_ut_callocate_and_track * * PARAMETERS:  Size                - Size of the allocation *              Component           - Component type of caller *              Module              - Source file name of caller *              Line                - Line number of caller * * RETURN:      Address of the allocated memory on success, NULL on failure. * * DESCRIPTION: Subsystem equivalent of calloc. * ******************************************************************************/void *acpi_ut_callocate_and_track(acpi_size size,				  u32 component, char *module, u32 line){	struct acpi_debug_mem_block *allocation;	acpi_status status;	allocation =	    acpi_ut_callocate(size + sizeof(struct acpi_debug_mem_header),			      component, module, line);	if (!allocation) {		/* Report allocation error */		_ACPI_REPORT_ERROR(module, line, component,				   ("ut_callocate: Could not allocate size %X\n",				    (u32) size));		return (NULL);	}	status = acpi_ut_track_allocation(allocation, size,					  ACPI_MEM_CALLOC, component, module,					  line);	if (ACPI_FAILURE(status)) {		acpi_os_free(allocation);		return (NULL);	}	acpi_gbl_global_list->total_allocated++;	acpi_gbl_global_list->current_total_size += (u32) size;	return ((void *)&allocation->user_space);}/******************************************************************************* * * FUNCTION:    acpi_ut_free_and_track * * PARAMETERS:  Allocation          - Address of the memory to deallocate *              Component           - Component type of caller *              Module              - Source file name of caller *              Line                - Line number of caller * * RETURN:      None * * DESCRIPTION: Frees the memory at Allocation * ******************************************************************************/voidacpi_ut_free_and_track(void *allocation, u32 component, char *module, u32 line){	struct acpi_debug_mem_block *debug_block;	acpi_status status;	ACPI_FUNCTION_TRACE_PTR("ut_free", allocation);	if (NULL == allocation) {		_ACPI_REPORT_ERROR(module, line, component,				   ("acpi_ut_free: Attempt to delete a NULL address\n"));		return_VOID;	}	debug_block = ACPI_CAST_PTR(struct acpi_debug_mem_block,				    (((char *)allocation) -				     sizeof(struct acpi_debug_mem_header)));	acpi_gbl_global_list->total_freed++;	acpi_gbl_global_list->current_total_size -= debug_block->size;	status = acpi_ut_remove_allocation(debug_block,					   component, module, line);	if (ACPI_FAILURE(status)) {		ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Could not free memory, %s\n",				  acpi_format_exception(status)));	}	acpi_os_free(debug_block);	ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS, "%p freed\n", allocation));	return_VOID;}/******************************************************************************* * * FUNCTION:    acpi_ut_find_allocation * * PARAMETERS:  Allocation              - Address of allocated memory * * RETURN:      A list element if found; NULL otherwise. * * DESCRIPTION: Searches for an element in the global allocation tracking list. * ******************************************************************************/static struct acpi_debug_mem_block *acpi_ut_find_allocation(void *allocation){	struct acpi_debug_mem_block *element;	ACPI_FUNCTION_ENTRY();	element = acpi_gbl_global_list->list_head;	/* Search for the address. */	while (element) {		if (element == allocation) {			return (element);		}		element = element->next;	}	return (NULL);}/******************************************************************************* * * FUNCTION:    acpi_ut_track_allocation * * PARAMETERS:  Allocation          - Address of allocated memory *              Size                - Size of the allocation *              alloc_type          - MEM_MALLOC or MEM_CALLOC *              Component           - Component type of caller *              Module              - Source file name of caller *              Line                - Line number of caller * * RETURN:      None. * * DESCRIPTION: Inserts an element into the global allocation tracking list. * ******************************************************************************/static acpi_statusacpi_ut_track_allocation(struct acpi_debug_mem_block *allocation,			 acpi_size size,			 u8 alloc_type, u32 component, char *module, u32 line){	struct acpi_memory_list *mem_list;	struct acpi_debug_mem_block *element;	acpi_status status = AE_OK;	ACPI_FUNCTION_TRACE_PTR("ut_track_allocation", allocation);	mem_list = acpi_gbl_global_list;	status = acpi_ut_acquire_mutex(ACPI_MTX_MEMORY);	if (ACPI_FAILURE(status)) {		return_ACPI_STATUS(status);	}	/*	 * Search list for this address to make sure it is not already on the list.	 * This will catch several kinds of problems.	 */	element = acpi_ut_find_allocation(allocation);	if (element) {		ACPI_REPORT_ERROR(("ut_track_allocation: Allocation already present in list! (%p)\n", allocation));		ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Element %p Address %p\n",				  element, allocation));		goto unlock_and_exit;	}	/* Fill in the instance data. */	allocation->size = (u32) size;	allocation->alloc_type = alloc_type;	allocation->component = component;	allocation->line = line;	ACPI_STRNCPY(allocation->module, module, ACPI_MAX_MODULE_NAME);	allocation->module[ACPI_MAX_MODULE_NAME - 1] = 0;	/* Insert at list head */	if (mem_list->list_head) {		((struct acpi_debug_mem_block *)(mem_list->list_head))->		    previous = allocation;	}	allocation->next = mem_list->list_head;	allocation->previous = NULL;	mem_list->list_head = allocation;      unlock_and_exit:	status = acpi_ut_release_mutex(ACPI_MTX_MEMORY);	return_ACPI_STATUS(status);}/******************************************************************************* * * FUNCTION:    acpi_ut_remove_allocation * * PARAMETERS:  Allocation          - Address of allocated memory *              Component           - Component type of caller *              Module              - Source file name of caller *              Line                - Line number of caller * * RETURN: * * DESCRIPTION: Deletes an element from the global allocation tracking list. * ******************************************************************************/static acpi_statusacpi_ut_remove_allocation(struct acpi_debug_mem_block *allocation,			  u32 component, char *module, u32 line){	struct acpi_memory_list *mem_list;	acpi_status status;	ACPI_FUNCTION_TRACE("ut_remove_allocation");	mem_list = acpi_gbl_global_list;	if (NULL == mem_list->list_head) {		/* No allocations! */		_ACPI_REPORT_ERROR(module, line, component,				   ("ut_remove_allocation: Empty allocation list, nothing to free!\n"));		return_ACPI_STATUS(AE_OK);	}	status = acpi_ut_acquire_mutex(ACPI_MTX_MEMORY);	if (ACPI_FAILURE(status)) {		return_ACPI_STATUS(status);	}	/* Unlink */	if (allocation->previous) {		(allocation->previous)->next = allocation->next;	} else {		mem_list->list_head = allocation->next;	}	if (allocation->next) {		(allocation->next)->previous = allocation->previous;	}	/* Mark the segment as deleted */	ACPI_MEMSET(&allocation->user_space, 0xEA, allocation->size);	ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS, "Freeing size 0%X\n",			  allocation->size));	status = acpi_ut_release_mutex(ACPI_MTX_MEMORY);	return_ACPI_STATUS(status);}/******************************************************************************* * * FUNCTION:    acpi_ut_dump_allocation_info * * PARAMETERS: * * RETURN:      None * * DESCRIPTION: Print some info about the outstanding allocations. * ******************************************************************************/#ifdef ACPI_FUTURE_USAGEvoid acpi_ut_dump_allocation_info(void){/*	struct acpi_memory_list         *mem_list;*/	ACPI_FUNCTION_TRACE("ut_dump_allocation_info");/*	ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES,			  ("%30s: %4d (%3d Kb)\n", "Current allocations",			  mem_list->current_count,			  ROUND_UP_TO_1K (mem_list->current_size)));	ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES,			  ("%30s: %4d (%3d Kb)\n", "Max concurrent allocations",			  mem_list->max_concurrent_count,			  ROUND_UP_TO_1K (mem_list->max_concurrent_size)));	ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES,			  ("%30s: %4d (%3d Kb)\n", "Total (all) internal objects",			  running_object_count,			  ROUND_UP_TO_1K (running_object_size)));	ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES,			  ("%30s: %4d (%3d Kb)\n", "Total (all) allocations",			  running_alloc_count,			  ROUND_UP_TO_1K (running_alloc_size)));	ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES,			  ("%30s: %4d (%3d Kb)\n", "Current Nodes",			  acpi_gbl_current_node_count,			  ROUND_UP_TO_1K (acpi_gbl_current_node_size)));	ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES,			  ("%30s: %4d (%3d Kb)\n", "Max Nodes",			  acpi_gbl_max_concurrent_node_count,			  ROUND_UP_TO_1K ((acpi_gbl_max_concurrent_node_count *					 sizeof (struct acpi_namespace_node)))));*/	return_VOID;}#endif				/*  ACPI_FUTURE_USAGE  *//******************************************************************************* * * FUNCTION:    acpi_ut_dump_allocations * * PARAMETERS:  Component           - Component(s) to dump info for. *              Module              - Module to dump info for.  NULL means all. * * RETURN:      None * * DESCRIPTION: Print a list of all outstanding allocations. * ******************************************************************************/void acpi_ut_dump_allocations(u32 component, char *module){	struct acpi_debug_mem_block *element;	union acpi_descriptor *descriptor;	u32 num_outstanding = 0;	ACPI_FUNCTION_TRACE("ut_dump_allocations");	/*	 * Walk the allocation list.	 */	if (ACPI_FAILURE(acpi_ut_acquire_mutex(ACPI_MTX_MEMORY))) {		return;	}	element = acpi_gbl_global_list->list_head;	while (element) {		if ((element->component & component) &&		    ((module == NULL)		     || (0 == ACPI_STRCMP(module, element->module)))) {			/* Ignore allocated objects that are in a cache */			descriptor =			    ACPI_CAST_PTR(union acpi_descriptor,					  &element->user_space);			if (descriptor->descriptor_id != ACPI_DESC_TYPE_CACHED) {				acpi_os_printf("%p Len %04X %9.9s-%d [%s] ",					       descriptor, element->size,					       element->module, element->line,					       acpi_ut_get_descriptor_name					       (descriptor));				/* Most of the elements will be Operand objects. */				switch (ACPI_GET_DESCRIPTOR_TYPE(descriptor)) {				case ACPI_DESC_TYPE_OPERAND:					acpi_os_printf("%12.12s R%hd",						       acpi_ut_get_type_name						       (descriptor->object.							common.type),						       descriptor->object.						       common.reference_count);					break;				case ACPI_DESC_TYPE_PARSER:					acpi_os_printf("aml_opcode %04hX",						       descriptor->op.asl.						       aml_opcode);					break;				case ACPI_DESC_TYPE_NAMED:					acpi_os_printf("%4.4s",						       acpi_ut_get_node_name						       (&descriptor->node));					break;				default:					break;				}				acpi_os_printf("\n");				num_outstanding++;			}		}		element = element->next;	}	(void)acpi_ut_release_mutex(ACPI_MTX_MEMORY);	/* Print summary */	if (!num_outstanding) {		ACPI_DEBUG_PRINT((ACPI_DB_ERROR,				  "No outstanding allocations.\n"));	} else {		ACPI_DEBUG_PRINT((ACPI_DB_ERROR,				  "%d(%X) Outstanding allocations\n",				  num_outstanding, num_outstanding));	}	return_VOID;}#endif				/* #ifdef ACPI_DBG_TRACK_ALLOCATIONS */

⌨️ 快捷键说明

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