pjproject/pjlib/include/pj/config.h

601 lines
15 KiB
C

/* $Id$ */
/*
* Copyright (C)2003-2006 Benny Prijono <benny@prijono.org>
*
* 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
*/
#ifndef __PJ_CONFIG_H__
#define __PJ_CONFIG_H__
/**
* @file config.h
* @brief PJLIB Main configuration settings.
*/
/********************************************************************
* Include compiler specific configuration.
*/
#if defined(_MSC_VER)
# include <pj/compat/cc_msvc.h>
#elif defined(__GNUC__)
# include <pj/compat/cc_gcc.h>
#else
# error "Unknown compiler."
#endif
/********************************************************************
* Include target OS specific configuration.
*/
#if defined(PJ_WIN32) && PJ_WIN32!=0
# include <pj/compat/os_win32.h>
#elif defined(PJ_WIN32_WINCE) && PJ_WIN32_WINCE!=0
# include <pj/compat/os_win32_wince.h>
#elif defined(PJ_LINUX) && PJ_LINUX!=0
# include <pj/compat/os_linux.h>
#elif defined(PJ_LINUX_KERNEL) && PJ_LINUX_KERNEL!=0
# include <pj/compat/os_linux_kernel.h>
#elif defined(PJ_PALMOS) && PJ_PALMOS!=0
# include <pj/compat/os_palmos.h>
#elif defined(PJ_SUNOS) && PJ_SUNOS!=0
# include <pj/compat/os_sunos.h>
#elif defined(PJ_DARWINOS) && PJ_DARWINOS!=0
# include <pj/compat/os_darwinos.h>
#elif defined(PJ_RTEMS) && PJ_RTEMS!=0
# include <pj/compat/os_rtems.h>
#else
# error "Please specify target os."
#endif
/********************************************************************
* Target machine specific configuration.
*/
#if defined (PJ_M_I386) && PJ_M_I386 != 0
# include <pj/compat/m_i386.h>
#elif defined (PJ_M_M68K) && PJ_M_M68K != 0
# include <pj/compat/m_m68k.h>
#elif defined (PJ_M_ALPHA) && PJ_M_ALPHA != 0
# include <pj/compat/m_alpha.h>
#elif defined (PJ_M_SPARC) && PJ_M_SPARC != 0
# include <pj/compat/m_sparc.h>
#elif defined (PJ_M_ARMV4) && PJ_M_ARMV4 != 0
# include <pj/compat/m_armv4.h>
#elif defined (PJ_M_POWERPC) && PJ_M_POWERPC != 0
# include <pj/compat/m_powerpc.h>
#else
# error "Please specify target machine."
#endif
/* Include size_t definition. */
#include <pj/compat/size_t.h>
/* Include site/user specific configuration to control PJLIB features.
* YOU MUST CREATE THIS FILE YOURSELF!!
*/
#include <pj/config_site.h>
/********************************************************************
* PJLIB Features.
*/
/* Overrides for DOXYGEN */
#ifdef DOXYGEN
# undef PJ_FUNCTIONS_ARE_INLINED
# undef PJ_HAS_FLOATING_POINT
# undef PJ_LOG_MAX_LEVEL
# undef PJ_LOG_MAX_SIZE
# undef PJ_LOG_USE_STACK_BUFFER
# undef PJ_TERM_HAS_COLOR
# undef PJ_POOL_DEBUG
# undef PJ_HAS_TCP
# undef PJ_MAX_HOSTNAME
# undef PJ_IOQUEUE_MAX_HANDLES
# undef FD_SETSIZE
# undef PJ_HAS_SEMAPHORE
# undef PJ_HAS_EVENT_OBJ
# undef PJ_ENABLE_EXTRA_CHECK
# undef PJ_EXCEPTION_USE_WIN32_SEH
# undef PJ_HAS_ERROR_STRING
#endif
/**
* @defgroup pj_config Build Configuration
* @ingroup PJ
* @{
*
* This section contains macros that can set during PJLIB build process
* to controll various aspects of the library.
*
* <b>Note</b>: the values in this page does NOT necessarily reflect to the
* macro values during the build process.
*/
/**
* If this macro is set to 1, it will enable some debugging checking
* in the library.
*
* Default: equal to (NOT NDEBUG).
*/
#ifndef PJ_DEBUG
# ifndef NDEBUG
# define PJ_DEBUG 1
# else
# define PJ_DEBUG 0
# endif
#endif
/**
* Expand functions in *_i.h header files as inline.
*
* Default: 0.
*/
#ifndef PJ_FUNCTIONS_ARE_INLINED
# define PJ_FUNCTIONS_ARE_INLINED 0
#endif
/**
* Use floating point computations in the library.
*
* Default: 1.
*/
#ifndef PJ_HAS_FLOATING_POINT
# define PJ_HAS_FLOATING_POINT 1
#endif
/**
* Declare maximum logging level/verbosity. Lower number indicates higher
* importance, with the highest importance has level zero. The least
* important level is five in this implementation, but this can be extended
* by supplying the appropriate implementation.
*
* The level conventions:
* - 0: fatal error
* - 1: error
* - 2: warning
* - 3: info
* - 4: debug
* - 5: trace
* - 6: more detailed trace
*
* Default: 4
*/
#ifndef PJ_LOG_MAX_LEVEL
# define PJ_LOG_MAX_LEVEL 5
#endif
/**
* Maximum message size that can be sent to output device for each call
* to PJ_LOG(). If the message size is longer than this value, it will be cut.
* This may affect the stack usage, depending whether PJ_LOG_USE_STACK_BUFFER
* flag is set.
*
* Default: 1500
*/
#ifndef PJ_LOG_MAX_SIZE
# define PJ_LOG_MAX_SIZE 1500
#endif
/**
* Log buffer.
* Does the log get the buffer from the stack? (default is yes).
* If the value is set to NO, then the buffer will be taken from static
* buffer, which in this case will make the log function non-reentrant.
*
* Default: 1
*/
#ifndef PJ_LOG_USE_STACK_BUFFER
# define PJ_LOG_USE_STACK_BUFFER 1
#endif
/**
* Colorfull terminal (for logging etc).
*
* Default: 1
*/
#ifndef PJ_TERM_HAS_COLOR
# define PJ_TERM_HAS_COLOR 1
#endif
/**
* If pool debugging is used, then each memory allocation from the pool
* will call malloc(), and pool will release all memory chunks when it
* is destroyed. This works better when memory verification programs
* such as Rational Purify is used.
*
* Default: 0
*/
#ifndef PJ_POOL_DEBUG
# define PJ_POOL_DEBUG 0
#endif
/**
* Specify this as \a stack_size argument in #pj_thread_create() to specify
* that thread should use default stack size for the current platform.
*
* Default: 8192
*/
#ifndef PJ_THREAD_DEFAULT_STACK_SIZE
# define PJ_THREAD_DEFAULT_STACK_SIZE 8192
#endif
/**
* Do we have alternate pool implementation?
*
* Default: 0
*/
#ifndef PJ_HAS_POOL_ALT_API
# define PJ_HAS_POOL_ALT_API PJ_POOL_DEBUG
#endif
/**
* \def PJ_HAS_TCP
* Support TCP in the library.
* Disabling TCP will reduce the footprint slightly (about 6KB).
*
* Default: 1
*/
#ifndef PJ_HAS_TCP
# define PJ_HAS_TCP 1
#endif
/**
* Maximum hostname length.
* Libraries sometimes needs to make copy of an address to stack buffer;
* the value here affects the stack usage.
*
* Default: 128
*/
#ifndef PJ_MAX_HOSTNAME
# define PJ_MAX_HOSTNAME (128)
#endif
/**
* Constants for declaring the maximum handles that can be supported by
* a single IOQ framework. This constant might not be relevant to the
* underlying I/O queue impelementation, but still, developers should be
* aware of this constant, to make sure that the program will not break when
* the underlying implementation changes.
*
* For implementation based on select(), the value here will be used as the
* maximum number of socket handles passed to select() (i.e. FD_SETSIZE will
* be set to this value).
*
* Default: if FD_SETSIZE is defined and the value is greather than 256,
* then it will be used. Otherwise 256 (64 for WinCE).
*/
#ifndef PJ_IOQUEUE_MAX_HANDLES
# if defined(PJ_WIN32_WINCE) && PJ_WIN32_WINCE!=0
# define PJ_IOQUEUE_MAX_HANDLES (64)
# else
# define PJ_IOQUEUE_MAX_HANDLES (256)
# endif
#endif
/**
* If PJ_IOQUEUE_HAS_SAFE_UNREG macro is defined, then ioqueue will do more
* things to ensure thread safety of handle unregistration operation by
* employing reference counter to each handle.
*
* In addition, the ioqueue will preallocate memory for the handles,
* according to the maximum number of handles that is specified during
* ioqueue creation.
*
* All applications would normally want this enabled, but you may disable
* this if:
* - there is no dynamic unregistration to all ioqueues.
* - there is no threading, or there is no preemptive multitasking.
*
* Default: 1
*/
#ifndef PJ_IOQUEUE_HAS_SAFE_UNREG
# define PJ_IOQUEUE_HAS_SAFE_UNREG 1
#endif
/**
* When safe unregistration (PJ_IOQUEUE_HAS_SAFE_UNREG) is configured in
* ioqueue, the PJ_IOQUEUE_KEY_FREE_DELAY macro specifies how long the
* ioqueue key is kept in closing state before it can be reused.
*
* The value is in miliseconds.
*
* Default: 500 msec.
*/
#ifndef PJ_IOQUEUE_KEY_FREE_DELAY
# define PJ_IOQUEUE_KEY_FREE_DELAY 500
#endif
/**
* Overrides FD_SETSIZE so it is consistent throughout the library.
* OS specific configuration header (compat/os_*) might have declared
* FD_SETSIZE, thus we only set if it hasn't been declared.
*
* Default: #PJ_IOQUEUE_MAX_HANDLES
*/
#ifndef FD_SETSIZE
# define FD_SETSIZE PJ_IOQUEUE_MAX_HANDLES
#endif
/**
* Has semaphore functionality?
*
* Default: 1
*/
#ifndef PJ_HAS_SEMAPHORE
# define PJ_HAS_SEMAPHORE 1
#endif
/**
* Event object (for synchronization, e.g. in Win32)
*
* Default: 1
*/
#ifndef PJ_HAS_EVENT_OBJ
# define PJ_HAS_EVENT_OBJ 1
#endif
/**
* Enable library's extra check.
* If this macro is enabled, #PJ_ASSERT_RETURN macro will expand to
* run-time checking. If this macro is disabled, #PJ_ASSERT_RETURN
* will simply evaluate to #pj_assert().
*
* You can disable this macro to reduce size, at the risk of crashes
* if invalid value (e.g. NULL) is passed to the library.
*
* Default: 1
*/
#ifndef PJ_ENABLE_EXTRA_CHECK
# define PJ_ENABLE_EXTRA_CHECK 1
#endif
/**
* Enable name registration for exceptions with #pj_exception_id_alloc().
* If this feature is enabled, then the library will keep track of
* names associated with each exception ID requested by application via
* #pj_exception_id_alloc().
*
* Disabling this macro will reduce the code and .bss size by a tad bit.
* See also #PJ_MAX_EXCEPTION_ID.
*
* Default: 1
*/
#ifndef PJ_HAS_EXCEPTION_NAMES
# define PJ_HAS_EXCEPTION_NAMES 1
#endif
/**
* Maximum number of unique exception IDs that can be requested
* with #pj_exception_id_alloc(). For each entry, a small record will
* be allocated in the .bss segment.
*
* Default: 16
*/
#ifndef PJ_MAX_EXCEPTION_ID
# define PJ_MAX_EXCEPTION_ID 16
#endif
/**
* Should we use Windows Structured Exception Handling (SEH) for the
* PJLIB exceptions.
*
* Default: 0
*/
#ifndef PJ_EXCEPTION_USE_WIN32_SEH
# define PJ_EXCEPTION_USE_WIN32_SEH 0
#endif
/**
* Should we attempt to use Pentium's rdtsc for high resolution
* timestamp.
*
* Default: 0
*/
#ifndef PJ_TIMESTAMP_USE_RDTSC
# define PJ_TIMESTAMP_USE_RDTSC 0
#endif
/**
* Include error message string in the library (pj_strerror()).
* This is very much desirable!
*
* Default: 1
*/
#ifndef PJ_HAS_ERROR_STRING
# define PJ_HAS_ERROR_STRING 1
#endif
/**
* Include pj_stricmp_alnum() and pj_strnicmp_alnum(), i.e. custom
* functions to compare alnum strings. On some systems, they're faster
* then stricmp/strcasecmp, but they can be slower on other systems.
* When disabled, pjlib will fallback to stricmp/strnicmp.
*
* Default: 0
*/
#ifndef PJ_HAS_STRICMP_ALNUM
# define PJ_HAS_STRICMP_ALNUM 0
#endif
/** @} */
/********************************************************************
* General macros.
*/
/**
* @def PJ_INLINE(type)
* @param type The return type of the function.
* Expand the function as inline.
*/
#define PJ_INLINE(type) PJ_INLINE_SPECIFIER type
/**
* @def PJ_DECL(type)
* @param type The return type of the function.
* Declare a function.
*/
/**
* @def PJ_DECL_NO_RETURN(type)
* @param type The return type of the function.
* Declare a function that will not return.
*/
/**
* @def PJ_BEGIN_DECL
* Mark beginning of declaration section in a header file.
*/
/**
* @def PJ_END_DECL
* Mark end of declaration section in a header file.
*/
#ifdef __cplusplus
# define PJ_DECL(type) type
# define PJ_DECL_NO_RETURN(type) type PJ_NORETURN
# define PJ_IDECL_NO_RETURN(type) PJ_INLINE(type) PJ_NORETURN
# define PJ_BEGIN_DECL extern "C" {
# define PJ_END_DECL }
#else
# define PJ_DECL(type) extern type
# define PJ_DECL_NO_RETURN(type) PJ_NORETURN type
# define PJ_IDECL_NO_RETURN(type) PJ_NORETURN PJ_INLINE(type)
# define PJ_BEGIN_DECL
# define PJ_END_DECL
#endif
/**
* @def PJ_DEF(type)
* @param type The return type of the function.
* Define a function.
*/
#define PJ_DEF(type) type
/**
* @def PJ_EXPORT_SYMBOL(sym)
* @param sym The symbol to export.
* Export the specified symbol in compilation type that requires export
* (e.g. Linux kernel).
*/
#ifdef __PJ_EXPORT_SYMBOL
# define PJ_EXPORT_SYMBOL(sym) __PJ_EXPORT_SYMBOL(sym)
#else
# define PJ_EXPORT_SYMBOL(sym)
#endif
/**
* @def PJ_IDECL(type)
* @param type The function's return type.
* Declare a function that may be expanded as inline.
*/
/**
* @def PJ_IDEF(type)
* @param type The function's return type.
* Define a function that may be expanded as inline.
*/
#if PJ_FUNCTIONS_ARE_INLINED
# define PJ_IDECL(type) PJ_INLINE(type)
# define PJ_IDEF(type) PJ_INLINE(type)
#else
# define PJ_IDECL(type) PJ_DECL(type)
# define PJ_IDEF(type) PJ_DEF(type)
#endif
/**
* @def PJ_UNUSED_ARG(arg)
* @param arg The argument name.
* PJ_UNUSED_ARG prevents warning about unused argument in a function.
*/
#define PJ_UNUSED_ARG(arg) (void)arg
/**
* @def PJ_TODO(id)
* @param id Any identifier that will be printed as TODO message.
* PJ_TODO macro will display TODO message as warning during compilation.
* Example: PJ_TODO(CLEAN_UP_ERROR);
*/
#ifndef PJ_TODO
# define PJ_TODO(id) TODO___##id:
#endif
/**
* Function attributes to inform that the function may throw exception.
*
* @param x The exception list, enclosed in parenthesis.
*/
#define __pj_throw__(x)
/********************************************************************
* Sanity Checks
*/
#ifndef PJ_HAS_HIGH_RES_TIMER
# error "PJ_HAS_HIGH_RES_TIMER is not defined!"
#endif
#if !defined(PJ_HAS_PENTIUM)
# error "PJ_HAS_PENTIUM is not defined!"
#endif
#if !defined(PJ_IS_LITTLE_ENDIAN)
# error "PJ_IS_LITTLE_ENDIAN is not defined!"
#endif
#if !defined(PJ_IS_BIG_ENDIAN)
# error "PJ_IS_BIG_ENDIAN is not defined!"
#endif
#if !defined(PJ_EMULATE_RWMUTEX)
# error "PJ_EMULATE_RWMUTEX should be defined in compat/os_xx.h"
#endif
#if !defined(PJ_THREAD_SET_STACK_SIZE)
# error "PJ_THREAD_SET_STACK_SIZE should be defined in compat/os_xx.h"
#endif
#if !defined(PJ_THREAD_ALLOCATE_STACK)
# error "PJ_THREAD_ALLOCATE_STACK should be defined in compat/os_xx.h"
#endif
PJ_BEGIN_DECL
/**
* PJLIB version string.
*/
extern const char *PJ_VERSION;
/**
* Dump configuration to log with verbosity equal to info(3).
*/
PJ_DECL(void) pj_dump_config(void);
PJ_END_DECL
#endif /* __PJ_CONFIG_H__ */