You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by am...@apache.org on 2018/02/22 16:22:05 UTC
[trafficserver] branch master updated: uses BufferWriter to compose
format string
This is an automated email from the ASF dual-hosted git repository.
amc pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git
The following commit(s) were added to refs/heads/master by this push:
new ba3e6fe uses BufferWriter to compose format string
ba3e6fe is described below
commit ba3e6fe36af8864e01a75cd89f098a911ef9b3d3
Author: Derek Dagit <de...@oath.com>
AuthorDate: Wed Feb 21 16:27:57 2018 -0600
uses BufferWriter to compose format string
---
lib/ts/Diags.cc | 147 +++++++++++++++++++++-----------------------------------
1 file changed, 54 insertions(+), 93 deletions(-)
diff --git a/lib/ts/Diags.cc b/lib/ts/Diags.cc
index 04ca6e2..abfa480 100644
--- a/lib/ts/Diags.cc
+++ b/lib/ts/Diags.cc
@@ -42,6 +42,7 @@
#include "ts/ink_time.h"
#include "ts/ink_hrtime.h"
#include "ts/ink_thread.h"
+#include "ts/BufferWriter.h"
#include "ts/Diags.h"
int diags_on_for_plugins = 0;
@@ -67,19 +68,6 @@ location(const SourceLocation *loc, DiagsShowLocation show, DiagsLevel level)
return false;
}
-template <int Size>
-static void
-vprintline(FILE *fp, char (&buffer)[Size], va_list ap)
-{
- int nbytes = strlen(buffer);
-
- vfprintf(fp, buffer, ap);
- if (nbytes > 0 && buffer[nbytes - 1] != '\n') {
- ink_assert(nbytes < Size);
- putc('\n', fp);
- }
-}
-
//////////////////////////////////////////////////////////////////////////////
//
// Diags::Diags(char *bdt, char *bat)
@@ -226,43 +214,51 @@ void
Diags::print_va(const char *debug_tag, DiagsLevel diags_level, const SourceLocation *loc, const char *format_string,
va_list ap) const
{
- struct timeval tp;
- const char *s;
- char *buffer, *d, timestamp_buf[48];
- char format_buf[1024], format_buf_w_ts[1024], *end_of_format;
-
ink_release_assert(diags_level < DiagsLevel_Count);
- ////////////////////////////////////////////////////////////////////////
- // there are 2 format buffers that hold a printf-style format string //
- // format_buf contains <prefix_string>: (<debug_tag>) <format_string> //
- // and format_buf_w_ts has the same thing with a prepended timestamp. //
- ////////////////////////////////////////////////////////////////////////
+ using ts::LocalBufferWriter;
+ LocalBufferWriter<1024> format_writer;
- format_buf[0] = NUL;
- format_buf_w_ts[0] = NUL;
+ // Save room for optional newline and terminating NUL bytes.
+ format_writer.clip(2);
- /////////////////////////////////////////////////////
- // format_buf holds 1024 characters, end_of_format //
- // points to the current available character //
- /////////////////////////////////////////////////////
+ //////////////////////
+ // append timestamp //
+ //////////////////////
+ {
+ struct timeval tp = ink_gettimeofday();
+ time_t cur_clock = (time_t)tp.tv_sec;
+ char timestamp_buf[48];
+ char *buffer = ink_ctime_r(&cur_clock, timestamp_buf);
- end_of_format = format_buf;
- *end_of_format = NUL;
+ int num_bytes_written = snprintf(&(timestamp_buf[19]), (sizeof(timestamp_buf) - 20), ".%03d", (int)(tp.tv_usec / 1000));
- // add the thread id
- end_of_format += snprintf(end_of_format, sizeof(format_buf), "{0x%" PRIx64 "} ", (uint64_t)ink_thread_self());
+ if (num_bytes_written > 0) {
+ format_writer.write('[');
+ format_writer.write(buffer + 4, num_bytes_written);
+ format_writer.write("] ", 2);
+ }
+ }
- //////////////////////////////////////
- // start with the diag level prefix //
- //////////////////////////////////////
+ size_t timestamp_end_offset = format_writer.size();
- for (s = level_name(diags_level); *s; *end_of_format++ = *s++) {
- ;
+ ///////////////////////
+ // add the thread id //
+ ///////////////////////
+ {
+ int num_bytes_written =
+ snprintf(format_writer.auxBuffer(), format_writer.remaining(), "{0x%" PRIx64 "} ", (uint64_t)ink_thread_self());
+ if (num_bytes_written > 0) {
+ format_writer.write(static_cast<size_t>(num_bytes_written));
+ }
}
- *end_of_format++ = ':';
- *end_of_format++ = ' ';
+ //////////////////////////////////
+ // append the diag level prefix //
+ //////////////////////////////////
+
+ format_writer.write(level_name(diags_level), strlen(level_name(diags_level)));
+ format_writer.write(": ", 2);
/////////////////////////////
// append location, if any //
@@ -272,66 +268,31 @@ Diags::print_va(const char *debug_tag, DiagsLevel diags_level, const SourceLocat
char *lp, buf[256];
lp = loc->str(buf, sizeof(buf));
if (lp) {
- *end_of_format++ = '<';
- for (s = lp; *s; *end_of_format++ = *s++) {
- ;
- }
- *end_of_format++ = '>';
- *end_of_format++ = ' ';
+ format_writer.write('<');
+ format_writer.write(lp, std::min(strlen(lp), sizeof(buf)));
+ format_writer.write("> ", 2);
}
}
//////////////////////////
// append debugging tag //
//////////////////////////
- if (debug_tag) {
- *end_of_format++ = '(';
- for (s = debug_tag; *s; *end_of_format++ = *s++) {
- ;
- }
- *end_of_format++ = ')';
- *end_of_format++ = ' ';
+ if (debug_tag != nullptr) {
+ format_writer.write('(');
+ format_writer.write(debug_tag, strlen(debug_tag));
+ format_writer.write(") ", 2);
}
//////////////////////////////////////////////////////
- // append original format string, and NUL terminate //
+ // append original format string, ensure there is a //
+ // newline, and NUL terminate //
//////////////////////////////////////////////////////
- for (s = format_string; *s; *end_of_format++ = *s++) {
- ;
+ format_writer.write(format_string, strlen(format_string));
+ format_writer.extend(2);
+ if (format_writer.data()[format_writer.size() - 1] != '\n') {
+ format_writer.write('\n');
}
- *end_of_format++ = NUL;
-
- //////////////////////////////////////////////////////////////////
- // prepend timestamp into the timestamped version of the buffer //
- //////////////////////////////////////////////////////////////////
-
- tp = ink_gettimeofday();
- time_t cur_clock = (time_t)tp.tv_sec;
- buffer = ink_ctime_r(&cur_clock, timestamp_buf);
-
- snprintf(&(timestamp_buf[19]), (sizeof(timestamp_buf) - 20), ".%03d", (int)(tp.tv_usec / 1000));
-
- d = format_buf_w_ts;
- *d++ = '[';
-
- for (int i = 4; buffer[i]; i++) {
- *d++ = buffer[i];
- }
-
- *d++ = ']';
- *d++ = ' ';
-
- for (int k = 0; prefix_str[k]; k++) {
- *d++ = prefix_str[k];
- }
-
- *d++ = ' ';
-
- for (s = format_buf; *s; *d++ = *s++) {
- ;
- }
-
- *d++ = NUL;
+ format_writer.write('\0');
//////////////////////////////////////
// now, finally, output the message //
@@ -342,7 +303,7 @@ Diags::print_va(const char *debug_tag, DiagsLevel diags_level, const SourceLocat
if (diags_log && diags_log->m_fp) {
va_list tmp;
va_copy(tmp, ap);
- vprintline(diags_log->m_fp, format_buf_w_ts, tmp);
+ vfprintf(diags_log->m_fp, format_writer.data(), tmp);
va_end(tmp);
}
}
@@ -351,7 +312,7 @@ Diags::print_va(const char *debug_tag, DiagsLevel diags_level, const SourceLocat
if (stdout_log && stdout_log->m_fp) {
va_list tmp;
va_copy(tmp, ap);
- vprintline(stdout_log->m_fp, format_buf_w_ts, tmp);
+ vfprintf(stdout_log->m_fp, format_writer.data(), tmp);
va_end(tmp);
}
}
@@ -360,7 +321,7 @@ Diags::print_va(const char *debug_tag, DiagsLevel diags_level, const SourceLocat
if (stderr_log && stderr_log->m_fp) {
va_list tmp;
va_copy(tmp, ap);
- vprintline(stderr_log->m_fp, format_buf_w_ts, tmp);
+ vfprintf(stderr_log->m_fp, format_writer.data(), tmp);
va_end(tmp);
}
}
@@ -404,7 +365,7 @@ Diags::print_va(const char *debug_tag, DiagsLevel diags_level, const SourceLocat
priority = LOG_NOTICE;
break;
}
- vsnprintf(syslog_buffer, sizeof(syslog_buffer) - 1, format_buf, ap);
+ vsnprintf(syslog_buffer, sizeof(syslog_buffer) - 1, format_writer.data() + timestamp_end_offset, ap);
syslog(priority, "%s", syslog_buffer);
}
--
To stop receiving notification emails like this one, please contact
amc@apache.org.