/******************************************************************************
 *
 * Module Name: cmalloc - local memory allocation routines
 *              $Revision: 73 $
 *
 *****************************************************************************/

/*
 *  Copyright (C) 2000 R. Byron Moore
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */


#include "acpi.h"
#include "acparser.h"
#include "acinterp.h"
#include "acnamesp.h"
#include "acglobal.h"

#define _COMPONENT          MISCELLANEOUS
	 MODULE_NAME         ("cmalloc")


/*****************************************************************************
 *
 * FUNCTION:    _Cm_allocate
 *
 * 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: The subsystem's equivalent of malloc.
 *
 ****************************************************************************/

void *
_cm_allocate (
	u32                     size,
	u32                     component,
	NATIVE_CHAR             *module,
	u32                     line)
{
	void                    *address = NULL;

	/* Check for an inadvertent size of zero bytes */

	if (!size) {
		REPORT_ERROR ("Cm_allocate: Attempt to allocate zero bytes");
		size = 1;
	}

	address = acpi_os_allocate (size);
	if (!address) {
		/* Report allocation error */

		_REPORT_ERROR (module, line, component,
			"Cm_allocate: Memory allocation failure");

		return (NULL);
	}


	return (address);
}


/*****************************************************************************
 *
 * FUNCTION:    _Cm_callocate
 *
 * 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 *
_cm_callocate (
	u32                     size,
	u32                     component,
	NATIVE_CHAR             *module,
	u32                     line)
{
	void                    *address = NULL;

	/* Check for an inadvertent size of zero bytes */

	if (!size) {
		REPORT_ERROR ("Cm_callocate: Attempt to allocate zero bytes");
		return (NULL);
	}


	address = acpi_os_callocate (size);

	if (!address) {
		/* Report allocation error */

		_REPORT_ERROR (module, line, component,
			"Cm_callocate: Memory allocation failure");

		return (NULL);
	}


	return (address);
}


/*****************************************************************************
 *
 * FUNCTION:    _Cm_free
 *
 * PARAMETERS:  Address             - 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 Address
 *
 ****************************************************************************/

void
_cm_free (
	void                    *address,
	u32                     component,
	NATIVE_CHAR             *module,
	u32                     line)
{

	if (NULL == address) {
		_REPORT_ERROR (module, line, component,
			"_Cm_free: Trying to delete a NULL address.");

		return;
	}


	acpi_os_free (address);

	return;
}


