You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
443 lines
18 KiB
443 lines
18 KiB
/* /////////////////////////////////////////////////////////////////////////
|
|
* File: pantheios/backend.h
|
|
*
|
|
* Purpose: Pantheios back end API
|
|
*
|
|
* Created: 21st June 2005
|
|
* Updated: 26th November 2010
|
|
*
|
|
* Home: http://www.pantheios.org/
|
|
*
|
|
* Copyright (c) 2005-2010, Matthew Wilson and Synesis Software
|
|
* Copyright (c) 1999-2005, Synesis Software and Matthew Wilson
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are
|
|
* met:
|
|
*
|
|
* - Redistributions of source code must retain the above copyright notice,
|
|
* this list of conditions and the following disclaimer.
|
|
* - Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* - Neither the name(s) of Matthew Wilson and Synesis Software nor the
|
|
* names of any contributors may be used to endorse or promote products
|
|
* derived from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*
|
|
* ////////////////////////////////////////////////////////////////////// */
|
|
|
|
|
|
/** \file pantheios/backend.h
|
|
*
|
|
* [C, C++] Definition of the \ref group__backend.
|
|
*/
|
|
|
|
#ifndef PANTHEIOS_INCL_PANTHEIOS_H_BACKEND
|
|
#define PANTHEIOS_INCL_PANTHEIOS_H_BACKEND
|
|
|
|
/* /////////////////////////////////////////////////////////////////////////
|
|
* Version information
|
|
*/
|
|
|
|
#ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
# define PANTHEIOS_VER_PANTHEIOS_H_BACKEND_MAJOR 3
|
|
# define PANTHEIOS_VER_PANTHEIOS_H_BACKEND_MINOR 11
|
|
# define PANTHEIOS_VER_PANTHEIOS_H_BACKEND_REVISION 1
|
|
# define PANTHEIOS_VER_PANTHEIOS_H_BACKEND_EDIT 31
|
|
#endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
|
|
/* /////////////////////////////////////////////////////////////////////////
|
|
* Includes
|
|
*/
|
|
|
|
#ifndef PANTHEIOS_INCL_PANTHEIOS_H_PANTHEIOS
|
|
# include <pantheios/pantheios.h>
|
|
#endif /* !PANTHEIOS_INCL_PANTHEIOS_H_PANTHEIOS */
|
|
|
|
/* /////////////////////////////////////////////////////////////////////////
|
|
* Back-end API
|
|
*/
|
|
|
|
/** \defgroup group__backend Pantheios Back-end API
|
|
*
|
|
* The Pantheios back-end API describes the required functionality of a back-end
|
|
* library. The back-end is responsible solely for translating the log entry -
|
|
* severity indicator + length-specified, nul-terminated string - into output,
|
|
* as appropriate to its implementation.
|
|
*
|
|
* There are several stock back-ends supplied with the Pantheios distribution
|
|
* (http://pantheios.org/), providing logging to stderr (using \c fprintf()),
|
|
* SysLog (using UNIX syslog(), or an emulation library on Windows), Windows
|
|
* Debugger, ACE output. You may also supply your own back-end by implementing
|
|
* the three simple functions of the API: pantheios_be_init(),
|
|
* pantheios_be_uninit(), and pantheios_be_logEntry().
|
|
*
|
|
* @{
|
|
*/
|
|
|
|
/** \defgroup group__backend__stock_backends Pantheios Stock Back-ends
|
|
*
|
|
* \ingroup group__backend
|
|
*
|
|
* Pre-built back-ends supplied with the Pantheios library
|
|
*
|
|
* Pantheios comes with several pre-written stock back-end libraries, which
|
|
* cover most common needs for diagnostic logging. They also serve as good
|
|
* examples of how to write a custom back-end.
|
|
*/
|
|
|
|
/** \defgroup group__backend__stock_ids Pantheios Stock Back-end Ids
|
|
*
|
|
* \ingroup group__backend
|
|
*
|
|
* Stock back-end identifiers used by the Pantheios back-end
|
|
* libraries.
|
|
*/
|
|
|
|
/** \def PANTHEIOS_BEID_ALL
|
|
*
|
|
* \ingroup group__backend__stock_ids
|
|
*
|
|
* Indicates that the operation/query applies to all back-ends
|
|
*/
|
|
|
|
#define PANTHEIOS_BEID_ALL (0)
|
|
|
|
/** \def PANTHEIOS_BEID_LOCAL
|
|
*
|
|
* \ingroup group__backend__stock_ids
|
|
*
|
|
* Identifies the local (or only) back-end in a link-unit
|
|
*/
|
|
|
|
#define PANTHEIOS_BEID_LOCAL (1)
|
|
|
|
/** \def PANTHEIOS_BEID_REMOTE
|
|
*
|
|
* \ingroup group__backend__stock_ids
|
|
*
|
|
* Identifies the remote back-end in a link-unit using local/remote
|
|
* splitting.
|
|
*/
|
|
|
|
#define PANTHEIOS_BEID_REMOTE (2)
|
|
|
|
/* /////////////////////////////////////////////////////////////////////////
|
|
* Constants
|
|
*/
|
|
|
|
/** \defgroup group__backend__init__flags Pantheios Back-end Initialisation Flags
|
|
*
|
|
* \ingroup group__backend
|
|
*
|
|
* Flags for the \ref group__backend__stock_backends
|
|
*/
|
|
|
|
/** \def PANTHEIOS_BE_INIT_F_NO_PROCESS_ID
|
|
* Causes the back-end to
|
|
* omit the process identity from emitted log statements.
|
|
* \ingroup group__backend__init__flags
|
|
*/
|
|
|
|
/** \def PANTHEIOS_BE_INIT_F_NO_THREAD_ID
|
|
* Causes the back-end to
|
|
* omit the thread identity from emitted log statements.
|
|
* \ingroup group__backend__init__flags
|
|
*/
|
|
|
|
/** \def PANTHEIOS_BE_INIT_F_NO_DATETIME
|
|
* Causes the back-end to
|
|
* omit the date/time field from emitted log statements.
|
|
* \ingroup group__backend__init__flags
|
|
*/
|
|
|
|
/** \def PANTHEIOS_BE_INIT_F_NO_SEVERITY
|
|
* Causes the back-end to
|
|
* omit the severity from emitted log statements.
|
|
* \ingroup group__backend__init__flags
|
|
*/
|
|
|
|
/** \def PANTHEIOS_BE_INIT_F_USE_SYSTEM_TIME
|
|
* Causes the back-end to
|
|
* use system time, rather than local time, from emitted log statements.
|
|
* \ingroup group__backend__init__flags
|
|
*/
|
|
|
|
/** \def PANTHEIOS_BE_INIT_F_DETAILS_AT_START
|
|
* Causes the details
|
|
* to be emitted at the start of the statement, rather than after the
|
|
* process id, time, and so on.
|
|
* \ingroup group__backend__init__flags
|
|
*/
|
|
|
|
/** \def PANTHEIOS_BE_INIT_F_USE_UNIX_FORMAT
|
|
* Causes the back-end to
|
|
* use UNIX format for the date/time field, even on other operating
|
|
* systems.
|
|
* \ingroup group__backend__init__flags
|
|
*/
|
|
|
|
/** \def PANTHEIOS_BE_INIT_F_HIDE_DATE
|
|
* Causes the back-end to
|
|
* omit the date in the date/time field (if shown).
|
|
* \ingroup group__backend__init__flags
|
|
*/
|
|
|
|
/** \def PANTHEIOS_BE_INIT_F_HIDE_TIME
|
|
* Causes the back-end to
|
|
* omit the time in the date/time field (if shown).
|
|
* \ingroup group__backend__init__flags
|
|
*/
|
|
|
|
/** \def PANTHEIOS_BE_INIT_F_HIGH_RESOLUTION
|
|
* Causes the back-end to
|
|
* favour high-resolution in the date/time field (if shown).
|
|
* \ingroup group__backend__init__flags
|
|
*/
|
|
|
|
/** \def PANTHEIOS_BE_INIT_F_LOW_RESOLUTION
|
|
* Causes the back-end to
|
|
* favour low-resolution in the date/time field (if shown).
|
|
* \ingroup group__backend__init__flags
|
|
*/
|
|
|
|
|
|
#define PANTHEIOS_BE_INIT_F_NO_PROCESS_ID (0x00000001)
|
|
#define PANTHEIOS_BE_INIT_F_NO_THREAD_ID (0x00001000)
|
|
#define PANTHEIOS_BE_INIT_F_NO_DATETIME (0x00000002)
|
|
#define PANTHEIOS_BE_INIT_F_NO_SEVERITY (0x00000004)
|
|
#define PANTHEIOS_BE_INIT_F_USE_SYSTEM_TIME (0x00000008)
|
|
#define PANTHEIOS_BE_INIT_F_DETAILS_AT_START (0x00000010)
|
|
#define PANTHEIOS_BE_INIT_F_USE_UNIX_FORMAT (0x00000020)
|
|
#define PANTHEIOS_BE_INIT_F_HIDE_DATE (0x00000040)
|
|
#define PANTHEIOS_BE_INIT_F_HIDE_TIME (0x00000080)
|
|
#define PANTHEIOS_BE_INIT_F_HIGH_RESOLUTION (0x00000100)
|
|
#define PANTHEIOS_BE_INIT_F_LOW_RESOLUTION (0x00000200)
|
|
|
|
|
|
/** \def PANTHEIOS_BE_INIT_F_COMMON_MASK
|
|
* Mask of stock back-end flags.
|
|
* \ingroup group__backend__init__flags
|
|
*/
|
|
|
|
/** \def PANTHEIOS_BE_INIT_F_CUSTOM_MASK
|
|
* Mask of custom back-end flags.
|
|
* \ingroup group__backend__init__flags
|
|
*/
|
|
|
|
|
|
#define PANTHEIOS_BE_INIT_F_COMMON_MASK (0x000fffff)
|
|
#ifdef __cplusplus
|
|
# define PANTHEIOS_BE_INIT_F_CUSTOM_MASK (~static_cast<int>(PANTHEIOS_BE_INIT_F_COMMON_MASK))
|
|
#else /* ? __cplusplus */
|
|
# define PANTHEIOS_BE_INIT_F_CUSTOM_MASK (~((int)PANTHEIOS_BE_INIT_F_COMMON_MASK))
|
|
#endif /* __cplusplus */
|
|
|
|
|
|
|
|
/** Initialises the back-end API.
|
|
*
|
|
* \ingroup group__backend
|
|
*
|
|
* This function is called once by the Pantheios core library to initialise the
|
|
* back-end library. It passes the process identity (in the form of a
|
|
* nul-terminated C-style string) and a second parameter (reserved for future
|
|
* use; currently always has value 0), which the back-end may use in its
|
|
* initialisation. The third parameter is a pointer to a void*, with which the
|
|
* back-end may store state, to be passed back to it in the pantheios_be_logEntry()
|
|
* and pantheios_be_uninit() functions.
|
|
*
|
|
* \param processIdentity The identity of the process within which Pantheios is
|
|
* being used. Should be a meaningful human-readable string. Must not be NULL.
|
|
* Maximum length is limited solely by what the back-end library can accomodate.
|
|
* The string pointed to by this parameter may not persist after the call is
|
|
* complete, so the back-end should take a copy if required.
|
|
* \param reserved Currently reserved. Will contain 0 in the current version of
|
|
* the Pantheios library
|
|
* \param ptoken Pointer to a variable to receive the back-end token, which will
|
|
* be stored in the Pantheios library and passed to the pantheios_be_logEntry()
|
|
* and pantheios_be_uninit() functions
|
|
*
|
|
* \note This function must be defined by each back-end implementation
|
|
*
|
|
* \note This function is called at most once per process.
|
|
*
|
|
* \return A status indicating whether the back-end is initialised, and
|
|
* therefore whether the Pantheios library as a whole is initialised.
|
|
* \retval <0 Initialisation failed.
|
|
* \retval >=0 Initialisation succeeded
|
|
*/
|
|
PANTHEIOS_CALL(int) pantheios_be_init(
|
|
PAN_CHAR_T const* processIdentity
|
|
, void* reserved
|
|
, void** ptoken
|
|
);
|
|
|
|
/** Uninitialises the back-end API.
|
|
*
|
|
* \ingroup group__backend
|
|
*
|
|
* This function is called to uninitialise the back-end library during the
|
|
* uninitialisation of the Pantheios core library. It is passed the value of the
|
|
* token stored on its behalf by the Pantheios core library.
|
|
*
|
|
* \note This function must be defined by each back-end implementation
|
|
*
|
|
* \note This function is called at most once per process.
|
|
*
|
|
* \param token The back-end token, created by the pantheios_be_init() function
|
|
*/
|
|
PANTHEIOS_CALL(void) pantheios_be_uninit(void* token);
|
|
|
|
/** Passes a log-entry to the back-end API.
|
|
*
|
|
* \ingroup group__backend
|
|
*
|
|
* This function is called by the Pantheios core library to emit a log entry.
|
|
* It is passed five parameters. The \c severity, \c entry and \c cchEntry
|
|
* parameters describe the severity level, and the nul-terminated contents of
|
|
* the log entry. The \c feToken and \c beToken parameters hold the
|
|
* library-specific state of the front-end and back-end librarys, respectively.
|
|
*
|
|
* \note This function must be defined by each back-end implementation
|
|
*
|
|
* \note This may be called from any thread in a multi-threaded process.
|
|
*
|
|
* \param feToken The front-end token, created by the pantheios_fe_init()
|
|
* function. This value does not hold any meaning to the back-end library, and
|
|
* may be used only to passed back to the front-end in calls to
|
|
* pantheios_fe_isSeverityLogged().
|
|
* \param beToken The back-end token, created by the pantheios_be_init() function
|
|
* \param severity The severity level.
|
|
* \param entry The nul-terminated string containing the entry information
|
|
* \param cchEntry The number of bytes in the string, not including the
|
|
* nul-terminating character
|
|
*/
|
|
PANTHEIOS_CALL(int) pantheios_be_logEntry(
|
|
void* feToken
|
|
, void* beToken
|
|
, int severity
|
|
, PAN_CHAR_T const* entry
|
|
, size_t cchEntry
|
|
);
|
|
|
|
/** @} group__backend */
|
|
|
|
/* /////////////////////////////////////////////////////////////////////////
|
|
* Generation Macros
|
|
*/
|
|
|
|
/** \def PANTHEIOS_BE_DEFINE_BE_FUNCTIONS(expr)
|
|
*
|
|
* Back-end generation macro for the Pantheios API
|
|
*
|
|
* Generates the functions <code>pantheios_be_init()</code>,
|
|
* <code>pantheios_be_uninit()</code> and
|
|
* <code>pantheios_be_logEntry()</code> from the given back-end
|
|
* implementation. The given id is assumed to be common to all three
|
|
* back-end API functions for the given back-end implementation. In other
|
|
* words, for the back-end "be.loader" one would specify the id to be
|
|
* <code>loader</code>, from which the macro assumes the existence of the
|
|
* three functions <code>pantheios_be_loader_init()</code>,
|
|
* <code>pantheios_be_loader_uninit()</code> and
|
|
* <code>pantheios_be_loader_logEntry()</code>.
|
|
*
|
|
* \param id The back-end identifier, e.g. <code>loader</code> for the
|
|
* "be.loader" back-end.
|
|
*/
|
|
#ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
# define PANTHEIOS_BE_DEFINE_BE_FUNCTIONS_(fullId) \
|
|
\
|
|
PANTHEIOS_CALL(int) pantheios_be_init(PAN_CHAR_T const* processIdentity, void* reserved, void** ptoken) \
|
|
{ return fullId##_init(processIdentity, PANTHEIOS_BEID_LOCAL, NULL, reserved, ptoken); } \
|
|
PANTHEIOS_CALL(void) pantheios_be_uninit(void* token) \
|
|
{ fullId##_uninit(token); } \
|
|
PANTHEIOS_CALL(int) pantheios_be_logEntry(void* feToken, void* beToken, int severity, PAN_CHAR_T const* entry, size_t cchEntry) \
|
|
{ STLSOFT_SUPPRESS_UNUSED(feToken); return fullId##_logEntry(feToken, beToken, severity, entry, cchEntry); }
|
|
#endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
|
|
#define PANTHEIOS_BE_DEFINE_BE_FUNCTIONS(id) PANTHEIOS_BE_DEFINE_BE_FUNCTIONS_(pantheios_be_##id)
|
|
|
|
|
|
|
|
|
|
/** \def PANTHEIOS_BE_DEFINE_BEL_FUNCTIONS(expr)
|
|
*
|
|
* Local back-end generation macro for the Pantheios API
|
|
*
|
|
* Generates the functions <code>pantheios_be_local_init()</code>,
|
|
* <code>pantheios_be_local_uninit()</code> and
|
|
* <code>pantheios_be_local_logEntry()</code> from the given back-end
|
|
* implementation. The given id is assumed to be common to all three
|
|
* back-end API functions for the given back-end implementation. In other
|
|
* words, for the back-end "be.loader" one would specify the id to be
|
|
* <code>loader</code>, from which the macro assumes the existence of the
|
|
* three functions <code>pantheios_be_loader_init()</code>,
|
|
* <code>pantheios_be_loader_uninit()</code> and
|
|
* <code>pantheios_be_loader_logEntry()</code>.
|
|
*
|
|
* \param id The back-end identifier, e.g. <code>loader</code> for the
|
|
* "be.loader" back-end.
|
|
*/
|
|
#ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
# define PANTHEIOS_BE_DEFINE_BEL_FUNCTIONS_(fullId) \
|
|
\
|
|
PANTHEIOS_CALL(int) pantheios_be_local_init(PAN_CHAR_T const* processIdentity, void* reserved, void** ptoken) \
|
|
{ return fullId##_init(processIdentity, PANTHEIOS_BEID_LOCAL, NULL, reserved, ptoken); } \
|
|
PANTHEIOS_CALL(void) pantheios_be_local_uninit(void* token) \
|
|
{ fullId##_uninit(token); } \
|
|
PANTHEIOS_CALL(int) pantheios_be_local_logEntry(void* feToken, void* beToken, int severity, PAN_CHAR_T const* entry, size_t cchEntry) \
|
|
{ STLSOFT_SUPPRESS_UNUSED(feToken); return fullId##_logEntry(feToken, beToken, severity, entry, cchEntry); }
|
|
#endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
|
|
#define PANTHEIOS_BE_DEFINE_BEL_FUNCTIONS(id) PANTHEIOS_BE_DEFINE_BEL_FUNCTIONS_(pantheios_be_##id)
|
|
|
|
/** \def PANTHEIOS_BE_DEFINE_BER_FUNCTIONS(expr)
|
|
*
|
|
* Remote back-end generation macro for the Pantheios API
|
|
*
|
|
* Generates the functions <code>pantheios_be_remote_init()</code>,
|
|
* <code>pantheios_be_remote_uninit()</code> and
|
|
* <code>pantheios_be_remote_logEntry()</code> from the given back-end
|
|
* implementation. The given id is assumed to be common to all three
|
|
* back-end API functions for the given back-end implementation. In other
|
|
* words, for the back-end "be.loader" one would specify the id to be
|
|
* <code>loader</code>, from which the macro assumes the existence of the
|
|
* three functions <code>pantheios_be_loader_init()</code>,
|
|
* <code>pantheios_be_loader_uninit()</code> and
|
|
* <code>pantheios_be_loader_logEntry()</code>.
|
|
*
|
|
* \param id The back-end identifier, e.g. <code>loader</code> for the
|
|
* "be.loader" back-end.
|
|
*/
|
|
#ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
# define PANTHEIOS_BE_DEFINE_BER_FUNCTIONS_(fullId) \
|
|
\
|
|
PANTHEIOS_CALL(int) pantheios_be_remote_init(PAN_CHAR_T const* processIdentity, void* reserved, void** ptoken) \
|
|
{ return fullId##_init(processIdentity, PANTHEIOS_BEID_REMOTE, NULL, reserved, ptoken); } \
|
|
PANTHEIOS_CALL(void) pantheios_be_remote_uninit(void* token) \
|
|
{ fullId##_uninit(token); } \
|
|
PANTHEIOS_CALL(int) pantheios_be_remote_logEntry(void* feToken, void* beToken, int severity, PAN_CHAR_T const* entry, size_t cchEntry) \
|
|
{ STLSOFT_SUPPRESS_UNUSED(feToken); return fullId##_logEntry(feToken, beToken, severity, entry, cchEntry); }
|
|
#endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
|
|
#define PANTHEIOS_BE_DEFINE_BER_FUNCTIONS(id) PANTHEIOS_BE_DEFINE_BER_FUNCTIONS_(pantheios_be_##id)
|
|
|
|
/* ////////////////////////////////////////////////////////////////////// */
|
|
|
|
#endif /* !PANTHEIOS_INCL_PANTHEIOS_H_BACKEND */
|
|
|
|
/* ///////////////////////////// end of file //////////////////////////// */
|