X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;ds=sidebyside;f=logging%2Flog.c;h=8d166a3093054680b21317d007dcf1cf67a1a3c4;hb=be7bbff934d18e407853436dd9f7da23c8c20743;hp=e31f867e13872c79aca8eda145b0ac023932e4c0;hpb=f61ad75488270a7c052714453bb27d6e043867db;p=babeltrace.git diff --git a/logging/log.c b/logging/log.c index e31f867e..8d166a30 100644 --- a/logging/log.c +++ b/logging/log.c @@ -6,6 +6,8 @@ #include #include +#include +#include #ifdef __CYGWIN__ extern unsigned long pthread_getsequence_np(pthread_t *); @@ -127,11 +129,10 @@ extern unsigned long pthread_getsequence_np(pthread_t *); #else #define BT_LOG_OPTIMIZE_SIZE 0 #endif -/* Size of the log line buffer. The buffer is allocated on stack. It limits - * maximum length of a log line. +/* Size of the log line buffer. The buffer is a globally allocated per thread. */ #ifndef BT_LOG_BUF_SZ - #define BT_LOG_BUF_SZ 512 + #define BT_LOG_BUF_SZ (4 * 4096) #endif /* Default number of bytes in one line of memory output. For large values * BT_LOG_BUF_SZ also must be increased. @@ -288,7 +289,7 @@ extern unsigned long pthread_getsequence_np(pthread_t *); #undef __STRICT_ANSI__ #endif #endif -#include +#include #include #include #include @@ -309,6 +310,8 @@ extern unsigned long pthread_getsequence_np(pthread_t *); #include #if defined(__linux__) #include + #elif (defined(__sun__) || defined(__CYGWIN__)) + /* Solaris and Cygwin have no sys/syslimits.h */ #else #include #endif @@ -487,7 +490,8 @@ extern unsigned long pthread_getsequence_np(pthread_t *); #define memccpy _memccpy #endif -#if (defined(_MSC_VER) && !defined(__INTEL_COMPILER)) || defined(__MINGW64__) +#if (defined(_MSC_VER) && !defined(__INTEL_COMPILER)) || \ + (defined(__MINGW64__) && !defined(__USE_MINGW_ANSI_STDIO)) #define vsnprintf(s, sz, fmt, va) fake_vsnprintf(s, sz, fmt, va) static int fake_vsnprintf(char *s, size_t sz, const char *fmt, va_list ap) { @@ -533,11 +537,10 @@ static void buffer_callback(bt_log_message *msg, char *buf); STATIC_ASSERT(eol_fits_eol_sz, sizeof(BT_LOG_EOL) <= BT_LOG_EOL_SZ); STATIC_ASSERT(eol_sz_greater_than_zero, 0 < BT_LOG_EOL_SZ); STATIC_ASSERT(eol_sz_less_than_buf_sz, BT_LOG_EOL_SZ < BT_LOG_BUF_SZ); -#if !defined(_WIN32) && !defined(_WIN64) - STATIC_ASSERT(buf_sz_less_than_pipe_buf, BT_LOG_BUF_SZ <= PIPE_BUF); -#endif static const char c_hex[] = "0123456789abcdef"; +static __thread char logging_buf[4 * 4096]; + static INSTRUMENTED_CONST unsigned g_buf_sz = BT_LOG_BUF_SZ - BT_LOG_EOL_SZ; static INSTRUMENTED_CONST time_cb g_time_cb = time_callback; static INSTRUMENTED_CONST pid_cb g_pid_cb = pid_callback; @@ -681,6 +684,7 @@ static const bt_log_output out_stderr = {BT_LOG_OUT_STDERR}; BT_LOG_DEFINE_GLOBAL_OUTPUT_LEVEL = 0; #endif +BT_HIDDEN const bt_log_spec _bt_log_stderr_spec = { BT_LOG_GLOBAL_FORMAT, @@ -739,7 +743,7 @@ static char lvl_char(const int lvl) #define TCACHE_FLUID (0x40000000 | 0x80000000) static unsigned g_tcache_mode = TCACHE_STALE; static struct timeval g_tcache_tv = {0, 0}; -static struct tm g_tcache_tm = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +static struct tm g_tcache_tm = {0}; static INLINE int tcache_get(const struct timeval *const tv, struct tm *const tm) { @@ -830,6 +834,8 @@ static void pid_callback(int *const pid, int *const tid) #elif defined(__CYGWIN__) pthread_t thr = pthread_self(); *tid = (int)pthread_getsequence_np(&thr); + #elif defined(__sun__) + *tid = (int)pthread_self(); #elif defined(__ANDROID__) *tid = gettid(); #elif defined(__linux__) @@ -900,7 +906,7 @@ static char *put_integer_r(unsigned v, const int sign, const unsigned w, const char wc, char *const e) { static const char _signs[] = {'-', '0', '+'}; - static const char *const signs = _signs + 1; + const char *const signs = _signs + 1; char *p = e; do { *--p = '0' + v % 10; } while (0 != (v /= 10)); if (0 == sign) return put_padding_r(w, wc, p, e); @@ -1256,7 +1262,7 @@ static void _bt_log_write_imp( const int lvl, const char *const tag, const char *const fmt, va_list va) { bt_log_message msg; - char buf[BT_LOG_BUF_SZ]; + char *buf = logging_buf; const unsigned mask = log->output->mask; msg.lvl = lvl; msg.tag = tag;