Skip to content

Commit 2644b64

Browse files
committed
Support flush at eom to ensure complete output
1 parent 593d9c7 commit 2644b64

File tree

5 files changed

+81
-10
lines changed

5 files changed

+81
-10
lines changed

src/util/cout_message.cpp

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -101,30 +101,47 @@ void console_message_handlert::print(
101101
if(level>=4)
102102
{
103103
std::cout << message << '\n';
104-
105-
if(level<=6)
106-
std::cout << std::flush;
107104
}
108105
else
109-
std::cerr << message << '\n' << std::flush;
106+
std::cerr << message << '\n';
110107
}
111108
#else
112-
// We flush after messages of level 6 or lower.
113-
// We don't for messages of level 7 or higher to improve performance,
114-
// in particular when writing to NFS.
115109
// Messages level 3 or lower go to cerr, messages level 4 or
116110
// above go to cout.
117111

118112
if(level>=4)
119113
{
120114
std::cout << message << '\n';
115+
}
116+
else
117+
std::cerr << message << '\n';
118+
#endif
119+
}
120+
121+
/*******************************************************************\
122+
123+
Function: console_message_handlert::flush
121124
125+
Inputs:
126+
127+
Outputs:
128+
129+
Purpose:
130+
131+
\*******************************************************************/
132+
133+
void console_message_handlert::flush(unsigned level)
134+
{
135+
// We flush after messages of level 6 or lower.
136+
// We don't for messages of level 7 or higher to improve performance,
137+
// in particular when writing to NFS.
138+
if(level>=4)
139+
{
122140
if(level<=6)
123141
std::cout << std::flush;
124142
}
125143
else
126-
std::cerr << message << '\n' << std::flush;
127-
#endif
144+
std::cerr << std::flush;
128145
}
129146

130147
/*******************************************************************\

src/util/cout_message.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ class console_message_handlert:public message_handlert
3232
virtual void print(
3333
unsigned level,
3434
const std::string &message) override;
35+
36+
virtual void flush(unsigned level) override;
3537
};
3638

3739
class gcc_message_handlert:public message_handlert

src/util/message.h

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ class message_handlert
3030
int sequence_number,
3131
const source_locationt &location);
3232

33+
virtual void flush(unsigned level)
34+
{
35+
// no-op by default
36+
}
37+
3338
virtual ~message_handlert()
3439
{
3540
}
@@ -84,6 +89,11 @@ class stream_message_handlert:public message_handlert
8489
}
8590
}
8691

92+
virtual void flush(unsigned level)
93+
{
94+
out << std::flush;
95+
}
96+
8797
protected:
8898
std::ostream &out;
8999
};
@@ -216,7 +226,15 @@ class messaget:public message_clientt
216226
// the printing of the message
217227
static inline mstreamt &eom(mstreamt &m)
218228
{
219-
m.message.print(m.message_level, m.str(), -1, m.source_location);
229+
if(m.message.message_handler)
230+
{
231+
m.message.message_handler->print(
232+
m.message_level,
233+
m.str(),
234+
-1,
235+
m.source_location);
236+
m.message.message_handler->flush(m.message_level);
237+
}
220238
m.clear(); // clears error bits
221239
m.str(std::string()); // clears the string
222240
m.source_location.clear();

src/util/ui_message.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,3 +323,35 @@ void ui_message_handlert::json_ui_msg(
323323
// a trailing comma.
324324
std::cout << ",\n" << result;
325325
}
326+
327+
/*******************************************************************\
328+
329+
Function: ui_message_handlert::flush
330+
331+
Inputs:
332+
333+
Outputs:
334+
335+
Purpose:
336+
337+
\*******************************************************************/
338+
339+
void ui_message_handlert::flush(unsigned level)
340+
{
341+
switch(get_ui())
342+
{
343+
case PLAIN:
344+
{
345+
console_message_handlert console_message_handler;
346+
console_message_handler.flush(level);
347+
}
348+
break;
349+
350+
case XML_UI:
351+
case JSON_UI:
352+
{
353+
std::cout << std::flush;
354+
}
355+
break;
356+
}
357+
}

src/util/ui_message.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ class ui_message_handlert:public message_handlert
3131
_ui=__ui;
3232
}
3333

34+
virtual void flush(unsigned level);
35+
3436
protected:
3537
uit _ui;
3638

0 commit comments

Comments
 (0)