/*  -
   Copyright (C) 2006 Weongyo Jeong (weongyo@gmail.com)

This file is part of ROVM.

ROVM 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, or (at your option) any later
version.

ROVM 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 GCC; see the file COPYING.  If not, write to the Free
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.  */

#include "types.h"
#include "mpool.h"

/*
  이 파일에는 사용 중인 memory pool 에 대한 wrapper 들로 구성되어 있습니다.
  이렇게 하는 이유는 아직 테스트 버전이기 때문에 안정적인 memory pool 을
  찾을 때 까지 쉽게 변경할 수 있도록 하기 위해서 입니다.

  !노트! 매크로를 이용하지 않는 이유는 디버깅을 위해서 입니다.
 */

/**
   Memory Pool 을 초기화합니다.  전역 변수들을 초기화하기 위한 것이며, 실행 
   과정에서 오직 한번만 호출되어야 합니다.
 */
void
init_mp (void)
{
  apr_pool_initialize ();
}

/**
   Memoru Pool 사용을 끝냅니다.  실행 과정에서 오직 한번만 호출되어야 합니다.
 */
void
finish_mp (void)
{
  apr_pool_terminate ();
}

/**
   Memory Pool 을 생성합니다.

   @param c	초기화할 rc_pool_t 변수
   @param p	부모 rc_pool_t 변수
 */
int
mp_create (c, p)
     rc_pool_t **c, *p;
{
  return apr_pool_create (c, p);
}

/**
   Memory Pool 을 생성합니다.

   @param n     새롭게 생성될 rc_pool_t 변수
   @param p     부모 rc_pool_t 변수
   @param fn    Abort Function
   @param a     Allocator 변수
 */
rc_status_t
mp_create_ex (rc_pool_t **n,
              rc_pool_t *p,
              rc_abortfunc_t fn,
              rc_allocator_t *a)
{
  return apr_pool_create_ex (n, p, fn, a);
}

/**
   할당된 Memory Pool 을 해제합니다.

   @param c	해체할 rc_pool_t 변수
 */
int
mp_destroy (c)
     rc_pool_t *c;
{
  apr_pool_destroy (c);

  return 0;
}

/**
   메모리를 calloc 형태로 할당합니다.

   @param c	사용할 rc_pool_t 변수
   @param size	할당할 메모리 크기
 */
void *
mp_calloc (c, size)
     rc_pool_t *c;
     size_t size;
{
  return apr_pcalloc (c, size);
}

/**
   메모리를 malloc 형태로 할당합니다.

   @param c	사용할 rc_pool_t 변수
   @param size	할당할 메모리 크기
 */
void *
mp_alloc (c, size)
     rc_pool_t *c;
     size_t size;
{
  return apr_palloc (c, size);
}

/**
   Pool 을 tag 마크한다.  (give it a name)

   @param p	Tag 마크를 할 pool
   @param t	Tag 이름
*/
void
mp_tag (p, t)
     apr_pool_t *p;
     const char *t;
{
  apr_pool_tag (p, t);
}

/**
   메모리 poll 변수 P 가 소멸될 때, 같이 소멸할 변수나 callback 을 등록합니다.

   @param p             해당 메모리 pool
   @param data          인자
   @param plain_cleanup Plain CleanUp
   @param child_cleanup Child CleanUp
 */
void
mp_cleanup_register (rc_pool_t *p,
                     const void *data,
                     rc_status_t (*plain_cleanup) (void *),
                     rc_status_t (*child_cleanup) (void *))
{
  apr_pool_cleanup_register (p, data, plain_cleanup, child_cleanup);
}

/**
   Allocator 를 생성합니다.

   @param a     초기화할 Allocator 변수
*/
rc_status_t
rc_allocator_create (rc_allocator_t **a)
{
  return apr_allocator_create (a);
}

/**
   Allocator 의 주인 메모리 풀을 설정합니다.

   @param a     Allocator
   @param p     메모리 풀
 */
void
rc_allocator_owner_set (rc_allocator_t *a, rc_pool_t *p)
{
  apr_allocator_owner_set (a, p);
}

/**
   Pool 내의 모든 메모리를 지우고, 모든 cleanup 을 실행합니다.

   @param p     지울 pool
 */
void
mp_clear (rc_pool_t *p)
{
  apr_pool_clear (p);
}

/**
   현재 이 pool 과 관련된 userdata 를 설정한다.

   @param data          설정할 data
   @param key           Key 값
   @param cleanup       Cleanup 함수
   @param pool          사용할 메모리 pool
 */
rc_status_t
mp_userdata_set (const void *data,
                 const char *key,
                 rc_status_t (*cleanup)(void *),
                 rc_pool_t *pool)
{
  return apr_pool_userdata_set (data, key, cleanup, pool);
}

/**
   현재 이 pool 에 설정된 userdata 를 얻어온다.

   @param data          넣을 data buffer
   @param key           Key 값
   @param pool          사용할 메모리 pool
 */
rc_status_t
mp_userdata_get (void **data, const char *key,
                 rc_pool_t *pool)
{
  return apr_pool_userdata_get (data, key, pool);
}

/**
   메모리 풀을 저장공간으로 하여 문자열 S 를 복사하여 반환한다.

   @param p     사용할 메모리 pool
   @param s     복제할 문자열 포인터
*/
char *
mp_strdup (rc_pool_t *p, const char *s)
{
  return apr_pstrdup (p, s);
}
