23 */ |
23 */ |
24 #include "precompiled.hpp" |
24 #include "precompiled.hpp" |
25 #include "logging/logDecorators.hpp" |
25 #include "logging/logDecorators.hpp" |
26 #include "logging/logDecorations.hpp" |
26 #include "logging/logDecorations.hpp" |
27 #include "logging/logFileStreamOutput.hpp" |
27 #include "logging/logFileStreamOutput.hpp" |
|
28 #include "logging/logMessageBuffer.hpp" |
28 #include "memory/allocation.inline.hpp" |
29 #include "memory/allocation.inline.hpp" |
29 |
30 |
30 LogStdoutOutput LogStdoutOutput::_instance; |
31 LogStdoutOutput LogStdoutOutput::_instance; |
31 LogStderrOutput LogStderrOutput::_instance; |
32 LogStderrOutput LogStderrOutput::_instance; |
32 |
33 |
33 int LogFileStreamOutput::write(const LogDecorations& decorations, const char* msg) { |
34 int LogFileStreamOutput::write_decorations(const LogDecorations& decorations) { |
34 char decoration_buf[LogDecorations::DecorationsBufferSize]; |
|
35 char* position = decoration_buf; |
|
36 int total_written = 0; |
35 int total_written = 0; |
37 |
36 |
38 for (uint i = 0; i < LogDecorators::Count; i++) { |
37 for (uint i = 0; i < LogDecorators::Count; i++) { |
39 LogDecorators::Decorator decorator = static_cast<LogDecorators::Decorator>(i); |
38 LogDecorators::Decorator decorator = static_cast<LogDecorators::Decorator>(i); |
40 if (!_decorators.is_decorator(decorator)) { |
39 if (!_decorators.is_decorator(decorator)) { |
41 continue; |
40 continue; |
42 } |
41 } |
43 int written = jio_snprintf(position, sizeof(decoration_buf) - total_written, "[%-*s]", |
42 |
44 _decorator_padding[decorator], |
43 int written = jio_fprintf(_stream, "[%-*s]", |
45 decorations.decoration(decorator)); |
44 _decorator_padding[decorator], |
|
45 decorations.decoration(decorator)); |
46 if (written <= 0) { |
46 if (written <= 0) { |
47 return -1; |
47 return -1; |
48 } else if (static_cast<size_t>(written - 2) > _decorator_padding[decorator]) { |
48 } else if (static_cast<size_t>(written - 2) > _decorator_padding[decorator]) { |
49 _decorator_padding[decorator] = written - 2; |
49 _decorator_padding[decorator] = written - 2; |
50 } |
50 } |
51 position += written; |
|
52 total_written += written; |
51 total_written += written; |
53 } |
52 } |
|
53 return total_written; |
|
54 } |
54 |
55 |
55 if (total_written == 0) { |
56 int LogFileStreamOutput::write(const LogDecorations& decorations, const char* msg) { |
56 total_written = jio_fprintf(_stream, "%s\n", msg); |
57 const bool use_decorations = !_decorators.is_empty(); |
57 } else { |
58 |
58 total_written = jio_fprintf(_stream, "%s %s\n", decoration_buf, msg); |
59 int written = 0; |
|
60 os::flockfile(_stream); |
|
61 if (use_decorations) { |
|
62 written += write_decorations(decorations); |
|
63 written += jio_fprintf(_stream, " "); |
|
64 } |
|
65 written += jio_fprintf(_stream, "%s\n", msg); |
|
66 fflush(_stream); |
|
67 os::funlockfile(_stream); |
|
68 |
|
69 return written; |
|
70 } |
|
71 |
|
72 int LogFileStreamOutput::write(LogMessageBuffer::Iterator msg_iterator) { |
|
73 const bool use_decorations = !_decorators.is_empty(); |
|
74 |
|
75 int written = 0; |
|
76 os::flockfile(_stream); |
|
77 for (; !msg_iterator.is_at_end(); msg_iterator++) { |
|
78 if (use_decorations) { |
|
79 written += write_decorations(msg_iterator.decorations()); |
|
80 written += jio_fprintf(_stream, " "); |
|
81 } |
|
82 written += jio_fprintf(_stream, "%s\n", msg_iterator.message()); |
59 } |
83 } |
60 fflush(_stream); |
84 fflush(_stream); |
61 return total_written; |
85 os::funlockfile(_stream); |
|
86 |
|
87 return written; |
62 } |
88 } |