internal.h
Go to the documentation of this file.
// -*- C++ -*-
// Module: Log4CPLUS
// File: internal.h
// Created: 1/2009
// Author: Vaclav Haisman
//
//
// Copyright (C) 2009-2017, Vaclav Haisman. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modifica-
// tion, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// 2. 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.
//
// THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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
// APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
// DING, 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.
#ifndef LOG4CPLUS_INTERNAL_INTERNAL_HEADER_
#define LOG4CPLUS_INTERNAL_INTERNAL_HEADER_
#include <log4cplus/config.hxx>
#if defined (LOG4CPLUS_HAVE_PRAGMA_ONCE)
#pragma once
#endif
#if ! defined (INSIDE_LOG4CPLUS)
# error "This header must not be be used outside log4cplus' implementation files."
#endif
#include <memory>
#include <vector>
#include <sstream>
#include <cstdio>
#include <log4cplus/tstring.h>
#include <log4cplus/streams.h>
#include <log4cplus/ndc.h>
#include <log4cplus/mdc.h>
#include <log4cplus/spi/loggingevent.h>
#include <log4cplus/thread/impl/tls.h>
#include <log4cplus/helpers/snprintf.h>
namespace log4cplus {
namespace internal {
extern log4cplus::tstring const empty_str;
struct gft_scratch_pad
{
gft_scratch_pad ();
~gft_scratch_pad ();
void
reset ()
{
uc_q_str_valid = false;
q_str_valid = false;
s_str_valid = false;
ret.clear ();
}
log4cplus::tstring q_str;
log4cplus::tstring uc_q_str;
log4cplus::tstring s_str;
log4cplus::tstring ret;
log4cplus::tstring fmt;
log4cplus::tstring tmp;
std::vector<tchar> buffer;
bool uc_q_str_valid;
bool q_str_valid;
bool s_str_valid;
};
struct appender_sratch_pad
{
appender_sratch_pad ();
~appender_sratch_pad ();
tostringstream oss;
tstring str;
std::string chstr;
};
struct per_thread_data
{
per_thread_data ();
~per_thread_data ();
tstring macros_str;
tostringstream macros_oss;
tostringstream layout_oss;
DiagnosticContextStack ndc_dcs;
MappedDiagnosticContextMap mdc_map;
log4cplus::tstring thread_name;
log4cplus::tstring thread_name2;
gft_scratch_pad gft_sp;
appender_sratch_pad appender_sp;
log4cplus::tstring faa_str;
log4cplus::tstring ll_str;
spi::InternalLoggingEvent forced_log_ev;
std::FILE * fnull;
log4cplus::helpers::snprintf_buf snprintf_buf;
};
per_thread_data * alloc_ptd ();
// TLS key whose value is pointer struct per_thread_data.
extern log4cplus::thread::impl::tls_key_type tls_storage_key;
#if ! defined (LOG4CPLUS_SINGLE_THREADED) \
&& defined (LOG4CPLUS_THREAD_LOCAL_VAR)
extern LOG4CPLUS_THREAD_LOCAL_VAR per_thread_data * ptd;
inline
void
set_ptd (per_thread_data * p)
{
ptd = p;
}
inline
per_thread_data *
get_ptd (bool alloc = true)
{
if (LOG4CPLUS_UNLIKELY (! ptd && alloc))
return alloc_ptd ();
// The assert() does not belong here. get_ptd() might be called by
// cleanup code that can handle the returned NULL pointer.
//assert (ptd);
return ptd;
}
#else // defined (LOG4CPLUS_THREAD_LOCAL_VAR)
inline
void
set_ptd (per_thread_data * p)
{
thread::impl::tls_set_value (tls_storage_key, p);
}
inline
per_thread_data *
get_ptd (bool alloc = true)
{
per_thread_data * ptd
= reinterpret_cast<per_thread_data *>(
thread::impl::tls_get_value (tls_storage_key));
if (LOG4CPLUS_UNLIKELY (! ptd && alloc))
return alloc_ptd ();
return ptd;
}
#endif // defined (LOG4CPLUS_THREAD_LOCAL_VAR)
inline
tstring &
get_thread_name_str ()
{
return get_ptd ()->thread_name;
}
inline
tstring &
get_thread_name2_str ()
{
return get_ptd ()->thread_name2;
}
inline
gft_scratch_pad &
get_gft_scratch_pad ()
{
return get_ptd ()->gft_sp;
}
inline
appender_sratch_pad &
get_appender_sp ()
{
return get_ptd ()->appender_sp;
}
} // namespace internal {
namespace detail
{
LOG4CPLUS_EXPORT void clear_tostringstream (tostringstream &);
} // namespace detail
} // namespace log4cplus {
#endif // LOG4CPLUS_INTERNAL_INTERNAL_HEADER_
log4cplus::helpers::snprintf_buf
Definition snprintf.h:43
log4cplus::spi::InternalLoggingEvent
The internal representation of logging events.
Definition loggingevent.h:51
config.hxx
LOG4CPLUS_UNLIKELY
#define LOG4CPLUS_UNLIKELY(cond)
Definition config.hxx:141
loggingevent.h
mdc.h
log4cplus::detail
Definition internal.h:234
log4cplus::detail::clear_tostringstream
LOG4CPLUS_EXPORT void clear_tostringstream(tostringstream &)
log4cplus::internal
Definition customloglevelmanager.h:58
log4cplus::internal::empty_str
log4cplus::tstring const empty_str
log4cplus::internal::set_ptd
void set_ptd(per_thread_data *p)
Definition internal.h:174
log4cplus::internal::get_thread_name_str
tstring & get_thread_name_str()
Definition internal.h:200
log4cplus::internal::get_thread_name2_str
tstring & get_thread_name2_str()
Definition internal.h:208
log4cplus::internal::get_ptd
per_thread_data * get_ptd(bool alloc=true)
Definition internal.h:182
log4cplus::internal::get_appender_sp
appender_sratch_pad & get_appender_sp()
Definition internal.h:224
log4cplus::internal::tls_storage_key
log4cplus::thread::impl::tls_key_type tls_storage_key
log4cplus::internal::get_gft_scratch_pad
gft_scratch_pad & get_gft_scratch_pad()
Definition internal.h:216
log4cplus::internal::alloc_ptd
per_thread_data * alloc_ptd()
log4cplus::thread::impl::tls_set_value
void tls_set_value(tls_key_type, tls_value_type)
log4cplus::thread::impl::tls_get_value
tls_value_type tls_get_value(tls_key_type)
log4cplus
Definition appender.h:46
log4cplus::tstring
std::basic_string< tchar > tstring
Definition tstring.h:39
log4cplus::tostringstream
std::basic_ostringstream< tchar > tostringstream
Definition streams.h:42
log4cplus::MappedDiagnosticContextMap
std::map< tstring, tstring > MappedDiagnosticContextMap
Definition mdc.h:43
log4cplus::DiagnosticContextStack
std::deque< DiagnosticContext > DiagnosticContextStack
Definition ndc.h:44
ndc.h
This header defined the NDC class.
snprintf.h
streams.h
log4cplus::internal::appender_sratch_pad
Definition internal.h:101
log4cplus::internal::appender_sratch_pad::chstr
std::string chstr
Definition internal.h:107
log4cplus::internal::appender_sratch_pad::oss
tostringstream oss
Definition internal.h:105
log4cplus::internal::appender_sratch_pad::~appender_sratch_pad
~appender_sratch_pad()
log4cplus::internal::appender_sratch_pad::str
tstring str
Definition internal.h:106
log4cplus::internal::appender_sratch_pad::appender_sratch_pad
appender_sratch_pad()
log4cplus::internal::gft_scratch_pad
Definition internal.h:74
log4cplus::internal::gft_scratch_pad::s_str
log4cplus::tstring s_str
Definition internal.h:89
log4cplus::internal::gft_scratch_pad::ret
log4cplus::tstring ret
Definition internal.h:90
log4cplus::internal::gft_scratch_pad::uc_q_str_valid
bool uc_q_str_valid
Definition internal.h:94
log4cplus::internal::gft_scratch_pad::gft_scratch_pad
gft_scratch_pad()
log4cplus::internal::gft_scratch_pad::buffer
std::vector< tchar > buffer
Definition internal.h:93
log4cplus::internal::gft_scratch_pad::q_str
log4cplus::tstring q_str
Definition internal.h:87
log4cplus::internal::gft_scratch_pad::tmp
log4cplus::tstring tmp
Definition internal.h:92
log4cplus::internal::gft_scratch_pad::s_str_valid
bool s_str_valid
Definition internal.h:96
log4cplus::internal::gft_scratch_pad::uc_q_str
log4cplus::tstring uc_q_str
Definition internal.h:88
log4cplus::internal::gft_scratch_pad::~gft_scratch_pad
~gft_scratch_pad()
log4cplus::internal::gft_scratch_pad::reset
void reset()
Definition internal.h:79
log4cplus::internal::gft_scratch_pad::fmt
log4cplus::tstring fmt
Definition internal.h:91
log4cplus::internal::gft_scratch_pad::q_str_valid
bool q_str_valid
Definition internal.h:95
log4cplus::internal::per_thread_data
Per thread data.
Definition internal.h:113
log4cplus::internal::per_thread_data::fnull
std::FILE * fnull
Definition internal.h:129
log4cplus::internal::per_thread_data::macros_oss
tostringstream macros_oss
Definition internal.h:118
log4cplus::internal::per_thread_data::faa_str
log4cplus::tstring faa_str
Definition internal.h:126
log4cplus::internal::per_thread_data::~per_thread_data
~per_thread_data()
log4cplus::internal::per_thread_data::gft_sp
gft_scratch_pad gft_sp
Definition internal.h:124
log4cplus::internal::per_thread_data::mdc_map
MappedDiagnosticContextMap mdc_map
Definition internal.h:121
log4cplus::internal::per_thread_data::forced_log_ev
spi::InternalLoggingEvent forced_log_ev
Definition internal.h:128
log4cplus::internal::per_thread_data::ndc_dcs
DiagnosticContextStack ndc_dcs
Definition internal.h:120
log4cplus::internal::per_thread_data::ll_str
log4cplus::tstring ll_str
Definition internal.h:127
log4cplus::internal::per_thread_data::per_thread_data
per_thread_data()
log4cplus::internal::per_thread_data::thread_name
log4cplus::tstring thread_name
Definition internal.h:122
log4cplus::internal::per_thread_data::snprintf_buf
log4cplus::helpers::snprintf_buf snprintf_buf
Definition internal.h:130
log4cplus::internal::per_thread_data::layout_oss
tostringstream layout_oss
Definition internal.h:119
log4cplus::internal::per_thread_data::thread_name2
log4cplus::tstring thread_name2
Definition internal.h:123
log4cplus::internal::per_thread_data::macros_str
tstring macros_str
Definition internal.h:117
log4cplus::internal::per_thread_data::appender_sp
appender_sratch_pad appender_sp
Definition internal.h:125
tls.h
tstring.h
LOG4CPLUS_EXPORT
#define LOG4CPLUS_EXPORT
Definition win32.h:141