utalloc.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:20k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /******************************************************************************
  2.  *
  3.  * Module Name: utalloc - local cache and memory allocation routines
  4.  *              $Revision: 106 $
  5.  *
  6.  *****************************************************************************/
  7. /*
  8.  *  Copyright (C) 2000, 2001 R. Byron Moore
  9.  *
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 2 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  23.  */
  24. #include "acpi.h"
  25. #include "acparser.h"
  26. #include "acinterp.h"
  27. #include "acnamesp.h"
  28. #include "acglobal.h"
  29. #define _COMPONENT          ACPI_UTILITIES
  30.  MODULE_NAME         ("utalloc")
  31. /******************************************************************************
  32.  *
  33.  * FUNCTION:    Acpi_ut_release_to_cache
  34.  *
  35.  * PARAMETERS:  List_id             - Memory list/cache ID
  36.  *              Object              - The object to be released
  37.  *
  38.  * RETURN:      None
  39.  *
  40.  * DESCRIPTION: Release an object to the specified cache.  If cache is full,
  41.  *              the object is deleted.
  42.  *
  43.  ******************************************************************************/
  44. void
  45. acpi_ut_release_to_cache (
  46. u32                     list_id,
  47. void                    *object)
  48. {
  49. ACPI_MEMORY_LIST        *cache_info;
  50. FUNCTION_ENTRY ();
  51. /* If walk cache is full, just free this wallkstate object */
  52. cache_info = &acpi_gbl_memory_lists[list_id];
  53. if (cache_info->cache_depth >= cache_info->max_cache_depth) {
  54. ACPI_MEM_FREE (object);
  55. ACPI_MEM_TRACKING (cache_info->total_freed++);
  56. }
  57. /* Otherwise put this object back into the cache */
  58. else {
  59. acpi_ut_acquire_mutex (ACPI_MTX_CACHES);
  60. /* Mark the object as cached */
  61. MEMSET (object, 0xCA, cache_info->object_size);
  62. ((acpi_operand_object *) object)->common.data_type = ACPI_CACHED_OBJECT;
  63. /* Put the object at the head of the cache list */
  64. * (char **) (((char *) object) + cache_info->link_offset) = cache_info->list_head;
  65. cache_info->list_head = object;
  66. cache_info->cache_depth++;
  67. acpi_ut_release_mutex (ACPI_MTX_CACHES);
  68. }
  69. }
  70. /******************************************************************************
  71.  *
  72.  * FUNCTION:    Acpi_ut_acquire_from_cache
  73.  *
  74.  * PARAMETERS:  List_id             - Memory list ID
  75.  *
  76.  * RETURN:      A requested object.  NULL if the object could not be
  77.  *              allocated.
  78.  *
  79.  * DESCRIPTION: Get an object from the specified cache.  If cache is empty,
  80.  *              the object is allocated.
  81.  *
  82.  ******************************************************************************/
  83. void *
  84. acpi_ut_acquire_from_cache (
  85. u32                     list_id)
  86. {
  87. ACPI_MEMORY_LIST        *cache_info;
  88. void                    *object;
  89. PROC_NAME ("Ut_acquire_from_cache");
  90. cache_info = &acpi_gbl_memory_lists[list_id];
  91. acpi_ut_acquire_mutex (ACPI_MTX_CACHES);
  92. ACPI_MEM_TRACKING (cache_info->cache_requests++);
  93. /* Check the cache first */
  94. if (cache_info->list_head) {
  95. /* There is an object available, use it */
  96. object = cache_info->list_head;
  97. cache_info->list_head = * (char **) (((char *) object) + cache_info->link_offset);
  98. ACPI_MEM_TRACKING (cache_info->cache_hits++);
  99. cache_info->cache_depth--;
  100. #ifdef ACPI_DBG_TRACK_ALLOCATIONS
  101. ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Object %p from %sn",
  102. object, acpi_gbl_memory_lists[list_id].list_name));
  103. #endif
  104. acpi_ut_release_mutex (ACPI_MTX_CACHES);
  105. /* Clear (zero) the previously used Object */
  106. MEMSET (object, 0, cache_info->object_size);
  107. }
  108. else {
  109. /* The cache is empty, create a new object */
  110. /* Avoid deadlock with ACPI_MEM_CALLOCATE */
  111. acpi_ut_release_mutex (ACPI_MTX_CACHES);
  112. object = ACPI_MEM_CALLOCATE (cache_info->object_size);
  113. ACPI_MEM_TRACKING (cache_info->total_allocated++);
  114. }
  115. return (object);
  116. }
  117. /******************************************************************************
  118.  *
  119.  * FUNCTION:    Acpi_ut_delete_generic_cache
  120.  *
  121.  * PARAMETERS:  List_id         - Memory list ID
  122.  *
  123.  * RETURN:      None
  124.  *
  125.  * DESCRIPTION: Free all objects within the requested cache.
  126.  *
  127.  ******************************************************************************/
  128. void
  129. acpi_ut_delete_generic_cache (
  130. u32                     list_id)
  131. {
  132. ACPI_MEMORY_LIST        *cache_info;
  133. char                    *next;
  134. FUNCTION_ENTRY ();
  135. cache_info = &acpi_gbl_memory_lists[list_id];
  136. while (cache_info->list_head) {
  137. /* Delete one cached state object */
  138. next = * (char **) (((char *) cache_info->list_head) + cache_info->link_offset);
  139. ACPI_MEM_FREE (cache_info->list_head);
  140. cache_info->list_head = next;
  141. cache_info->cache_depth--;
  142. }
  143. }
  144. #ifdef ACPI_DBG_TRACK_ALLOCATIONS
  145. /*
  146.  * These procedures are used for tracking memory leaks in the subsystem, and
  147.  * they get compiled out when the ACPI_DBG_TRACK_ALLOCATIONS is not set.
  148.  *
  149.  * Each memory allocation is tracked via a doubly linked list.  Each
  150.  * element contains the caller's component, module name, function name, and
  151.  * line number.  Acpi_ut_allocate and Acpi_ut_callocate call
  152.  * Acpi_ut_track_allocation to add an element to the list; deletion
  153.  * occurs in the body of Acpi_ut_free.
  154.  */
  155. /*******************************************************************************
  156.  *
  157.  * FUNCTION:    Acpi_ut_find_allocation
  158.  *
  159.  * PARAMETERS:  Address             - Address of allocated memory
  160.  *
  161.  * RETURN:      A list element if found; NULL otherwise.
  162.  *
  163.  * DESCRIPTION: Searches for an element in the global allocation tracking list.
  164.  *
  165.  ******************************************************************************/
  166. acpi_debug_mem_block *
  167. acpi_ut_find_allocation (
  168. u32                     list_id,
  169. void                    *address)
  170. {
  171. acpi_debug_mem_block    *element;
  172. FUNCTION_ENTRY ();
  173. if (list_id > ACPI_MEM_LIST_MAX) {
  174. return (NULL);
  175. }
  176. element = acpi_gbl_memory_lists[list_id].list_head;
  177. /* Search for the address. */
  178. while (element) {
  179. if (element == address) {
  180. return (element);
  181. }
  182. element = element->next;
  183. }
  184. return (NULL);
  185. }
  186. /*******************************************************************************
  187.  *
  188.  * FUNCTION:    Acpi_ut_track_allocation
  189.  *
  190.  * PARAMETERS:  Address             - Address of allocated memory
  191.  *              Size                - Size of the allocation
  192.  *              Alloc_type          - MEM_MALLOC or MEM_CALLOC
  193.  *              Component           - Component type of caller
  194.  *              Module              - Source file name of caller
  195.  *              Line                - Line number of caller
  196.  *
  197.  * RETURN:      None.
  198.  *
  199.  * DESCRIPTION: Inserts an element into the global allocation tracking list.
  200.  *
  201.  ******************************************************************************/
  202. acpi_status
  203. acpi_ut_track_allocation (
  204. u32                     list_id,
  205. acpi_debug_mem_block    *address,
  206. u32                     size,
  207. u8                      alloc_type,
  208. u32                     component,
  209. NATIVE_CHAR             *module,
  210. u32                     line)
  211. {
  212. ACPI_MEMORY_LIST        *mem_list;
  213. acpi_debug_mem_block    *element;
  214. acpi_status             status = AE_OK;
  215. FUNCTION_TRACE_PTR ("Ut_track_allocation", address);
  216. if (list_id > ACPI_MEM_LIST_MAX) {
  217. return_ACPI_STATUS (AE_BAD_PARAMETER);
  218. }
  219. mem_list = &acpi_gbl_memory_lists[list_id];
  220. acpi_ut_acquire_mutex (ACPI_MTX_MEMORY);
  221. /*
  222.  * Search list for this address to make sure it is not already on the list.
  223.  * This will catch several kinds of problems.
  224.  */
  225. element = acpi_ut_find_allocation (list_id, address);
  226. if (element) {
  227. REPORT_ERROR (("Ut_track_allocation: Address already present in list! (%p)n",
  228. address));
  229. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Element %p Address %pn", element, address));
  230. goto unlock_and_exit;
  231. }
  232. /* Fill in the instance data. */
  233. address->size      = size;
  234. address->alloc_type = alloc_type;
  235. address->component = component;
  236. address->line      = line;
  237. STRNCPY (address->module, module, MAX_MODULE_NAME);
  238. /* Insert at list head */
  239. if (mem_list->list_head) {
  240. ((acpi_debug_mem_block *)(mem_list->list_head))->previous = address;
  241. }
  242. address->next = mem_list->list_head;
  243. address->previous = NULL;
  244. mem_list->list_head = address;
  245. unlock_and_exit:
  246. acpi_ut_release_mutex (ACPI_MTX_MEMORY);
  247. return_ACPI_STATUS (status);
  248. }
  249. /*******************************************************************************
  250.  *
  251.  * FUNCTION:    Acpi_ut_remove_allocation
  252.  *
  253.  * PARAMETERS:  Address             - Address of allocated memory
  254.  *              Component           - Component type of caller
  255.  *              Module              - Source file name of caller
  256.  *              Line                - Line number of caller
  257.  *
  258.  * RETURN:
  259.  *
  260.  * DESCRIPTION: Deletes an element from the global allocation tracking list.
  261.  *
  262.  ******************************************************************************/
  263. acpi_status
  264. acpi_ut_remove_allocation (
  265. u32                     list_id,
  266. acpi_debug_mem_block    *address,
  267. u32                     component,
  268. NATIVE_CHAR             *module,
  269. u32                     line)
  270. {
  271. ACPI_MEMORY_LIST        *mem_list;
  272. FUNCTION_TRACE ("Ut_remove_allocation");
  273. if (list_id > ACPI_MEM_LIST_MAX) {
  274. return_ACPI_STATUS (AE_BAD_PARAMETER);
  275. }
  276. mem_list = &acpi_gbl_memory_lists[list_id];
  277. if (NULL == mem_list->list_head) {
  278. /* No allocations! */
  279. _REPORT_ERROR (module, line, component,
  280. ("Ut_remove_allocation: Empty allocation list, nothing to free!n"));
  281. return_ACPI_STATUS (AE_OK);
  282. }
  283. acpi_ut_acquire_mutex (ACPI_MTX_MEMORY);
  284. /* Unlink */
  285. if (address->previous) {
  286. (address->previous)->next = address->next;
  287. }
  288. else {
  289. mem_list->list_head = address->next;
  290. }
  291. if (address->next) {
  292. (address->next)->previous = address->previous;
  293. }
  294. /* Mark the segment as deleted */
  295. MEMSET (&address->user_space, 0xEA, address->size);
  296. ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "Freeing size %Xn", address->size));
  297. acpi_ut_release_mutex (ACPI_MTX_MEMORY);
  298. return_ACPI_STATUS (AE_OK);
  299. }
  300. /*******************************************************************************
  301.  *
  302.  * FUNCTION:    Acpi_ut_dump_allocation_info
  303.  *
  304.  * PARAMETERS:
  305.  *
  306.  * RETURN:      None
  307.  *
  308.  * DESCRIPTION: Print some info about the outstanding allocations.
  309.  *
  310.  ******************************************************************************/
  311. void
  312. acpi_ut_dump_allocation_info (
  313. void)
  314. {
  315. /*
  316. ACPI_MEMORY_LIST        *Mem_list;
  317. */
  318. FUNCTION_TRACE ("Ut_dump_allocation_info");
  319. /*
  320. ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES,
  321.   ("%30s: %4d (%3d Kb)n", "Current allocations",
  322.   Mem_list->Current_count,
  323.   ROUND_UP_TO_1K (Mem_list->Current_size)));
  324. ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES,
  325.   ("%30s: %4d (%3d Kb)n", "Max concurrent allocations",
  326.   Mem_list->Max_concurrent_count,
  327.   ROUND_UP_TO_1K (Mem_list->Max_concurrent_size)));
  328. ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES,
  329.   ("%30s: %4d (%3d Kb)n", "Total (all) internal objects",
  330.   Running_object_count,
  331.   ROUND_UP_TO_1K (Running_object_size)));
  332. ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES,
  333.   ("%30s: %4d (%3d Kb)n", "Total (all) allocations",
  334.   Running_alloc_count,
  335.   ROUND_UP_TO_1K (Running_alloc_size)));
  336. ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES,
  337.   ("%30s: %4d (%3d Kb)n", "Current Nodes",
  338.   Acpi_gbl_Current_node_count,
  339.   ROUND_UP_TO_1K (Acpi_gbl_Current_node_size)));
  340. ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES,
  341.   ("%30s: %4d (%3d Kb)n", "Max Nodes",
  342.   Acpi_gbl_Max_concurrent_node_count,
  343.   ROUND_UP_TO_1K ((Acpi_gbl_Max_concurrent_node_count * sizeof (acpi_namespace_node)))));
  344. */
  345. return_VOID;
  346. }
  347. /*******************************************************************************
  348.  *
  349.  * FUNCTION:    Acpi_ut_dump_allocations
  350.  *
  351.  * PARAMETERS:  Component           - Component(s) to dump info for.
  352.  *              Module              - Module to dump info for.  NULL means all.
  353.  *
  354.  * RETURN:      None
  355.  *
  356.  * DESCRIPTION: Print a list of all outstanding allocations.
  357.  *
  358.  ******************************************************************************/
  359. void
  360. acpi_ut_dump_allocations (
  361. u32                     component,
  362. NATIVE_CHAR             *module)
  363. {
  364. acpi_debug_mem_block    *element;
  365. u32                     i;
  366. FUNCTION_TRACE ("Ut_dump_allocations");
  367. element = acpi_gbl_memory_lists[0].list_head;
  368. if (element == NULL) {
  369. ACPI_DEBUG_PRINT ((ACPI_DB_OK,
  370. "No outstanding allocations.n"));
  371. return_VOID;
  372. }
  373. /*
  374.  * Walk the allocation list.
  375.  */
  376. acpi_ut_acquire_mutex (ACPI_MTX_MEMORY);
  377. ACPI_DEBUG_PRINT ((ACPI_DB_OK,
  378. "Outstanding allocations:n"));
  379. for (i = 1; ; i++)  /* Just a counter */ {
  380. if ((element->component & component) &&
  381. ((module == NULL) || (0 == STRCMP (module, element->module)))) {
  382. if (((acpi_operand_object  *)(&element->user_space))->common.type != ACPI_CACHED_OBJECT) {
  383. ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK,
  384.  "%p Len %04X %9.9s-%d",
  385.  &element->user_space, element->size, element->module,
  386.  element->line));
  387. /* Most of the elements will be internal objects. */
  388. switch (((acpi_operand_object  *)
  389. (&element->user_space))->common.data_type) {
  390. case ACPI_DESC_TYPE_INTERNAL:
  391. ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK,
  392. " Obj_type %12.12s R%d",
  393. acpi_ut_get_type_name (((acpi_operand_object *)(&element->user_space))->common.type),
  394. ((acpi_operand_object *)(&element->user_space))->common.reference_count));
  395. break;
  396. case ACPI_DESC_TYPE_PARSER:
  397. ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK,
  398. " Parse_obj Opcode %04X",
  399. ((acpi_parse_object *)(&element->user_space))->opcode));
  400. break;
  401. case ACPI_DESC_TYPE_NAMED:
  402. ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK,
  403. " Node %4.4s",
  404. (char*)&((acpi_namespace_node *)(&element->user_space))->name));
  405. break;
  406. case ACPI_DESC_TYPE_STATE:
  407. ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK,
  408. " Untyped State_obj"));
  409. break;
  410. case ACPI_DESC_TYPE_STATE_UPDATE:
  411. ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK,
  412. " UPDATE State_obj"));
  413. break;
  414. case ACPI_DESC_TYPE_STATE_PACKAGE:
  415. ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK,
  416. " PACKAGE State_obj"));
  417. break;
  418. case ACPI_DESC_TYPE_STATE_CONTROL:
  419. ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK,
  420. " CONTROL State_obj"));
  421. break;
  422. case ACPI_DESC_TYPE_STATE_RPSCOPE:
  423. ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK,
  424. " ROOT-PARSE-SCOPE State_obj"));
  425. break;
  426. case ACPI_DESC_TYPE_STATE_PSCOPE:
  427. ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK,
  428. " PARSE-SCOPE State_obj"));
  429. break;
  430. case ACPI_DESC_TYPE_STATE_WSCOPE:
  431. ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK,
  432. " WALK-SCOPE State_obj"));
  433. break;
  434. case ACPI_DESC_TYPE_STATE_RESULT:
  435. ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK,
  436. " RESULT State_obj"));
  437. break;
  438. case ACPI_DESC_TYPE_STATE_NOTIFY:
  439. ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK,
  440. " NOTIFY State_obj"));
  441. break;
  442. }
  443. ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, "n"));
  444. }
  445. }
  446. if (element->next == NULL) {
  447. break;
  448. }
  449. element = element->next;
  450. }
  451. acpi_ut_release_mutex (ACPI_MTX_MEMORY);
  452. ACPI_DEBUG_PRINT ((ACPI_DB_OK,
  453. "Total number of unfreed allocations = %d(%X)n", i,i));
  454. return_VOID;
  455. }
  456. /*******************************************************************************
  457.  *
  458.  * FUNCTION:    Acpi_ut_allocate
  459.  *
  460.  * PARAMETERS:  Size                - Size of the allocation
  461.  *              Component           - Component type of caller
  462.  *              Module              - Source file name of caller
  463.  *              Line                - Line number of caller
  464.  *
  465.  * RETURN:      Address of the allocated memory on success, NULL on failure.
  466.  *
  467.  * DESCRIPTION: The subsystem's equivalent of malloc.
  468.  *
  469.  ******************************************************************************/
  470. void *
  471. acpi_ut_allocate (
  472. u32                     size,
  473. u32                     component,
  474. NATIVE_CHAR             *module,
  475. u32                     line)
  476. {
  477. acpi_debug_mem_block    *address;
  478. acpi_status             status;
  479. FUNCTION_TRACE_U32 ("Ut_allocate", size);
  480. /* Check for an inadvertent size of zero bytes */
  481. if (!size) {
  482. _REPORT_ERROR (module, line, component,
  483. ("Ut_allocate: Attempt to allocate zero bytesn"));
  484. size = 1;
  485. }
  486. address = acpi_os_allocate (size + sizeof (acpi_debug_mem_block));
  487. if (!address) {
  488. /* Report allocation error */
  489. _REPORT_ERROR (module, line, component,
  490. ("Ut_allocate: Could not allocate size %Xn", size));
  491. return_PTR (NULL);
  492. }
  493. status = acpi_ut_track_allocation (ACPI_MEM_LIST_GLOBAL, address, size,
  494.   MEM_MALLOC, component, module, line);
  495. if (ACPI_FAILURE (status)) {
  496. acpi_os_free (address);
  497. return_PTR (NULL);
  498. }
  499. acpi_gbl_memory_lists[ACPI_MEM_LIST_GLOBAL].total_allocated++;
  500. acpi_gbl_memory_lists[ACPI_MEM_LIST_GLOBAL].current_total_size += size;
  501. ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "%p Size %Xn", address, size));
  502. return_PTR ((void *) &address->user_space);
  503. }
  504. /*******************************************************************************
  505.  *
  506.  * FUNCTION:    Acpi_ut_callocate
  507.  *
  508.  * PARAMETERS:  Size                - Size of the allocation
  509.  *              Component           - Component type of caller
  510.  *              Module              - Source file name of caller
  511.  *              Line                - Line number of caller
  512.  *
  513.  * RETURN:      Address of the allocated memory on success, NULL on failure.
  514.  *
  515.  * DESCRIPTION: Subsystem equivalent of calloc.
  516.  *
  517.  ******************************************************************************/
  518. void *
  519. acpi_ut_callocate (
  520. u32                     size,
  521. u32                     component,
  522. NATIVE_CHAR             *module,
  523. u32                     line)
  524. {
  525. acpi_debug_mem_block    *address;
  526. acpi_status             status;
  527. FUNCTION_TRACE_U32 ("Ut_callocate", size);
  528. /* Check for an inadvertent size of zero bytes */
  529. if (!size) {
  530. _REPORT_ERROR (module, line, component,
  531. ("Ut_callocate: Attempt to allocate zero bytesn"));
  532. return_PTR (NULL);
  533. }
  534. address = acpi_os_callocate (size + sizeof (acpi_debug_mem_block));
  535. if (!address) {
  536. /* Report allocation error */
  537. _REPORT_ERROR (module, line, component,
  538. ("Ut_callocate: Could not allocate size %Xn", size));
  539. return_PTR (NULL);
  540. }
  541. status = acpi_ut_track_allocation (ACPI_MEM_LIST_GLOBAL, address, size,
  542.    MEM_CALLOC, component, module, line);
  543. if (ACPI_FAILURE (status)) {
  544. acpi_os_free (address);
  545. return_PTR (NULL);
  546. }
  547. acpi_gbl_memory_lists[ACPI_MEM_LIST_GLOBAL].total_allocated++;
  548. acpi_gbl_memory_lists[ACPI_MEM_LIST_GLOBAL].current_total_size += size;
  549. ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "%p Size %Xn", address, size));
  550. return_PTR ((void *) &address->user_space);
  551. }
  552. /*******************************************************************************
  553.  *
  554.  * FUNCTION:    Acpi_ut_free
  555.  *
  556.  * PARAMETERS:  Address             - Address of the memory to deallocate
  557.  *              Component           - Component type of caller
  558.  *              Module              - Source file name of caller
  559.  *              Line                - Line number of caller
  560.  *
  561.  * RETURN:      None
  562.  *
  563.  * DESCRIPTION: Frees the memory at Address
  564.  *
  565.  ******************************************************************************/
  566. void
  567. acpi_ut_free (
  568. void                    *address,
  569. u32                     component,
  570. NATIVE_CHAR             *module,
  571. u32                     line)
  572. {
  573. acpi_debug_mem_block    *debug_block;
  574. FUNCTION_TRACE_PTR ("Ut_free", address);
  575. if (NULL == address) {
  576. _REPORT_ERROR (module, line, component,
  577. ("Acpi_ut_free: Trying to delete a NULL addressn"));
  578. return_VOID;
  579. }
  580. debug_block = (acpi_debug_mem_block *)
  581.   (((char *) address) - sizeof (acpi_debug_mem_header));
  582. acpi_gbl_memory_lists[ACPI_MEM_LIST_GLOBAL].total_freed++;
  583. acpi_gbl_memory_lists[ACPI_MEM_LIST_GLOBAL].current_total_size -= debug_block->size;
  584. acpi_ut_remove_allocation (ACPI_MEM_LIST_GLOBAL, debug_block,
  585. component, module, line);
  586. acpi_os_free (debug_block);
  587. ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "%p freedn", address));
  588. return_VOID;
  589. }
  590. #endif  /* #ifdef ACPI_DBG_TRACK_ALLOCATIONS */