/**************************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 *************************************************************/



#include "rtl/alloc.h"
#include "alloc_impl.h"

#ifndef INCLUDED_STRING_H
#include <string.h>
#define INCLUDED_STRING_H
#endif

#if !defined(FORCE_SYSALLOC)

/* ================================================================= *
 *
 * custom allocator includes.
 *
 * ================================================================= */

#ifndef INCLUDED_STDIO_H
#include <stdio.h>
#define INCLUDED_STDIO_H
#endif
#include "internal/once.h"
#include "sal/macros.h"
#include "osl/diagnose.h"

/* ================================================================= *
 *
 * custom allocator internals.
 *
 * ================================================================= */

static const sal_Size g_alloc_sizes[] =
{
	/* powers of 2**(1/4) */
	4 *    4,           6 *    4,
	4 *    8, 5 *    8, 6 *    8, 7 *    8,
	4 *   16, 5 *   16, 6 *   16, 7 *   16,
	4 *   32, 5 *   32, 6 *   32, 7 *   32,
	4 *   64, 5 *   64, 6 *   64, 7 *   64,
	4 *  128, 5 *  128, 6 *  128, 7 *  128,
	4 *  256, 5 *  256, 6 *  256, 7 *  256,
	4 *  512, 5 *  512, 6 *  512, 7 *  512,
	4 * 1024, 5 * 1024, 6 * 1024, 7 * 1024,
	4 * 2048, 5 * 2048, 6 * 2048, 7 * 2048,
	4 * 4096
};

#define RTL_MEMORY_CACHED_LIMIT 4 * 4096
#define RTL_MEMORY_CACHED_SIZES (sizeof(g_alloc_sizes) / sizeof(g_alloc_sizes[0]))

static rtl_cache_type * g_alloc_caches[RTL_MEMORY_CACHED_SIZES] =
{
	0,
};

#ifdef NEED_ALIGN16
#define RTL_MEMALIGN       16
#define RTL_MEMALIGN_SHIFT 4
#else
#define RTL_MEMALIGN       8
#define RTL_MEMALIGN_SHIFT 3
#endif

static rtl_cache_type * g_alloc_table[RTL_MEMORY_CACHED_LIMIT >> RTL_MEMALIGN_SHIFT] =
{
	0,
};

static rtl_arena_type * gp_alloc_arena = NULL;

/* ================================================================= *
 *
 * custom allocator initialization / finalization.
 *
 * ================================================================= */

static void
rtl_memory_once_init (void)
{
	{
		/* global memory arena */
		OSL_ASSERT(gp_alloc_arena == NULL);

		gp_alloc_arena = rtl_arena_create (
			"rtl_alloc_arena",
			2048,     /* quantum */
			0,        /* w/o quantum caching */
			0,        /* default source */
			rtl_arena_alloc,
			rtl_arena_free,
			0         /* flags */
		);
		OSL_ASSERT(gp_alloc_arena != NULL);
	}
	{
		sal_Size size;
		int i, n = RTL_MEMORY_CACHED_SIZES;

		for (i = 0; i < n; i++)
		{
			char name[RTL_CACHE_NAME_LENGTH + 1];
			(void) snprintf (name, sizeof(name), "rtl_alloc_%lu", g_alloc_sizes[i]);
			g_alloc_caches[i] = rtl_cache_create (name, g_alloc_sizes[i], 0, NULL, NULL, NULL, NULL, NULL, 0);
		}

		size = RTL_MEMALIGN;
		for (i = 0; i < n; i++)
		{
			while (size <= g_alloc_sizes[i])
			{
				g_alloc_table[(size - 1) >> RTL_MEMALIGN_SHIFT] = g_alloc_caches[i];
				size += RTL_MEMALIGN;
			}
		}
	}
}

static int
rtl_memory_init (void)
{
	static sal_once_type g_once = SAL_ONCE_INIT;
	SAL_ONCE(&g_once, rtl_memory_once_init);
	return (gp_alloc_arena != NULL);
}

/* ================================================================= */

/*
  Issue http://udk.openoffice.org/issues/show_bug.cgi?id=92388

  Mac OS X does not seem to support "__cxa__atexit", thus leading
  to the situation that "__attribute__((destructor))__" functions
  (in particular "rtl_{memory|cache|arena}_fini") become called
  _before_ global C++ object d'tors.

  Delegated the call to "rtl_memory_fini()" into a dummy C++ object,
  see alloc_fini.cxx .
*/
#if defined(__GNUC__) && !defined(MACOSX)
static void rtl_memory_fini (void) __attribute__((destructor));
#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
#pragma fini(rtl_memory_fini)
static void rtl_memory_fini (void);
#endif /* __GNUC__ || __SUNPRO_C */

void
rtl_memory_fini (void)
{
	int i, n;

	/* clear g_alloc_table */
	memset (g_alloc_table, 0, sizeof(g_alloc_table));

	/* cleanup g_alloc_caches */
	for (i = 0, n = RTL_MEMORY_CACHED_SIZES; i < n; i++)
	{
		if (g_alloc_caches[i] != NULL)
		{
			rtl_cache_destroy (g_alloc_caches[i]);
			g_alloc_caches[i] = NULL;
		}
	}

	/* cleanup gp_alloc_arena */
	if (gp_alloc_arena != NULL)
	{
		rtl_arena_destroy (gp_alloc_arena);
		gp_alloc_arena = NULL;
	}
}

/* ================================================================= *
 *
 * custom allocator implemenation.
 *
 * ================================================================= */

void *
SAL_CALL rtl_allocateMemory (sal_Size n) SAL_THROW_EXTERN_C()
{
	void * p = 0;
	if (n > 0)
	{
		char *     addr;
		sal_Size   size = RTL_MEMORY_ALIGN(n + RTL_MEMALIGN, RTL_MEMALIGN);

		OSL_ASSERT(RTL_MEMALIGN >= sizeof(sal_Size));
		if (n >= SAL_MAX_SIZE - (RTL_MEMALIGN + RTL_MEMALIGN - 1))
		{
			/* requested size too large for roundup alignment */
			return 0;
		}

try_alloc:
		if (size <= RTL_MEMORY_CACHED_LIMIT)
			addr = (char*)rtl_cache_alloc(g_alloc_table[(size - 1) >> RTL_MEMALIGN_SHIFT]);
		else
			addr = (char*)rtl_arena_alloc (gp_alloc_arena, &size);

		if (addr != 0)
		{
			((sal_Size*)(addr))[0] = size;
			p = addr + RTL_MEMALIGN;
		}
		else if (gp_alloc_arena == 0)
		{
			if (rtl_memory_init())
			{
				/* try again */
				goto try_alloc;
			}
		}
	}
	return (p);
}

/* ================================================================= */

void SAL_CALL rtl_freeMemory (void * p) SAL_THROW_EXTERN_C()
{
	if (p != 0)
	{
		char *   addr = (char*)(p) - RTL_MEMALIGN;
		sal_Size size = ((sal_Size*)(addr))[0];

		if (size <= RTL_MEMORY_CACHED_LIMIT)
			rtl_cache_free(g_alloc_table[(size - 1) >> RTL_MEMALIGN_SHIFT], addr);
		else
			rtl_arena_free (gp_alloc_arena, addr, size);
	}
}

/* ================================================================= */

void * SAL_CALL rtl_reallocateMemory (void * p, sal_Size n) SAL_THROW_EXTERN_C()
{
	if (n > 0)
	{
		if (p != 0)
		{
			void *   p_old = p;
			sal_Size n_old = ((sal_Size*)( (char*)(p) - RTL_MEMALIGN  ))[0] - RTL_MEMALIGN;

			p = rtl_allocateMemory (n);
			if (p != 0)
			{
				memcpy (p, p_old, SAL_MIN(n, n_old));
				rtl_freeMemory (p_old);
			}
		}
		else
		{
			p = rtl_allocateMemory (n);
		}
	}
	else if (p != 0)
	{
		rtl_freeMemory (p), p = 0;
	}
	return (p);
}

#else  /* FORCE_SYSALLOC */

/* ================================================================= *
 *
 * system allocator includes.
 *
 * ================================================================= */

#ifndef INCLUDED_STDLIB_H
#include <stdlib.h>
#define INCLUDED_STDLIB_H
#endif

/* ================================================================= *
 *
 * system allocator implemenation.
 *
 * ================================================================= */

void * SAL_CALL rtl_allocateMemory (sal_Size n)
{
	return malloc (n);
}

/* ================================================================= */

void SAL_CALL rtl_freeMemory (void * p)
{
	free (p);
}

/* ================================================================= */

void * SAL_CALL rtl_reallocateMemory (void * p, sal_Size n)
{
	return realloc (p, n);
}

/* ================================================================= */

void
rtl_memory_fini (void)
{
	/* nothing to do */
}

#endif /* FORCE_SYSALLOC */

/* ================================================================= *
 *
 * rtl_(allocate|free)ZeroMemory() implemenation.
 *
 * ================================================================= */

void * SAL_CALL rtl_allocateZeroMemory (sal_Size n) SAL_THROW_EXTERN_C()
{
	void * p = rtl_allocateMemory (n);
	if (p != 0)
		memset (p, 0, n);
	return (p);
}

/* ================================================================= */

void SAL_CALL rtl_freeZeroMemory (void * p, sal_Size n) SAL_THROW_EXTERN_C()
{
	if (p != 0)
	{
		memset (p, 0, n);
		rtl_freeMemory (p);
	}
}

/* ================================================================= */
