2018-01-25 21:59:19 +00:00
|
|
|
|
|
|
|
#include "trick/MessageThreadedCout.hh"
|
|
|
|
#include "trick/message_type.h"
|
|
|
|
#include "trick/release.h"
|
|
|
|
|
|
|
|
#include <sstream>
|
|
|
|
|
|
|
|
Trick::MessageThreadedCout::MessageThreadedCout() :
|
|
|
|
max_buffer_items(400),
|
|
|
|
max_buffer_size(4000) ,
|
|
|
|
print_immediate(false) ,
|
|
|
|
copy_ptr(NULL),
|
2023-02-08 23:58:59 +00:00
|
|
|
write_ptr(NULL),
|
|
|
|
SysThread("threadedcout") {
|
2018-01-25 21:59:19 +00:00
|
|
|
/** By default, this subscriber is enabled when it is created. */
|
|
|
|
Trick::MessageSubscriber::name = "threadedcout" ;
|
|
|
|
color_code.reserve(6) ;
|
|
|
|
StringNode * temp = new StringNode(max_buffer_size) ;
|
|
|
|
write_ptr = copy_ptr = temp ;
|
|
|
|
for ( unsigned int ii = 1 ; ii < max_buffer_items ; ii++ ) {
|
|
|
|
temp = new StringNode(max_buffer_size) ;
|
|
|
|
copy_ptr->next = temp ;
|
|
|
|
copy_ptr = temp ;
|
|
|
|
}
|
|
|
|
copy_ptr->next = write_ptr ;
|
|
|
|
copy_ptr = write_ptr ;
|
|
|
|
|
|
|
|
pthread_mutex_init(&write_mutex, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
int Trick::MessageThreadedCout::init() {
|
|
|
|
create_thread() ;
|
|
|
|
return 0 ;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Trick::MessageThreadedCout::update( unsigned int level , std::string header , std::string message ) {
|
|
|
|
|
|
|
|
/** @li Prints the received message to the standard output stream. */
|
|
|
|
if (enabled && level < 100 ) {
|
|
|
|
switch (level) {
|
|
|
|
case MSG_NORMAL :
|
|
|
|
color_code = "\033[00m" ; // normal
|
|
|
|
break ;
|
|
|
|
case MSG_INFO :
|
|
|
|
color_code = "\033[32m" ; // green
|
|
|
|
break ;
|
|
|
|
case MSG_WARNING :
|
|
|
|
color_code = "\033[33m" ; // yellow
|
|
|
|
break ;
|
|
|
|
case MSG_ERROR :
|
|
|
|
color_code = "\033[31m" ; // red
|
|
|
|
break ;
|
|
|
|
case MSG_DEBUG :
|
|
|
|
color_code = "\033[36m" ; // cyan
|
|
|
|
break ;
|
|
|
|
default :
|
|
|
|
color_code = "\033[00m" ; // normal
|
|
|
|
break ;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( copy_ptr->next != write_ptr ) {
|
|
|
|
copy_ptr->copy(header, color_code, message) ;
|
|
|
|
copy_ptr = copy_ptr->next ;
|
|
|
|
// After shutdown the sim sends a termination message. print it now.
|
|
|
|
if ( print_immediate ) {
|
|
|
|
write_pending_messages() ;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void * Trick::MessageThreadedCout::thread_body() {
|
|
|
|
while(1) {
|
|
|
|
write_pending_messages() ;
|
|
|
|
RELEASE() ;
|
|
|
|
}
|
2018-08-16 21:02:11 +00:00
|
|
|
return (void*)0;
|
2018-01-25 21:59:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void Trick::MessageThreadedCout::write_pending_messages() {
|
|
|
|
pthread_mutex_lock(&write_mutex) ;
|
|
|
|
while ( write_ptr != copy_ptr ) {
|
|
|
|
std::cout << write_ptr->buffer << std::flush ;
|
|
|
|
write_ptr = write_ptr->next ;
|
|
|
|
}
|
|
|
|
pthread_mutex_unlock(&write_mutex) ;
|
|
|
|
}
|
|
|
|
|
|
|
|
int Trick::MessageThreadedCout::shutdown() {
|
|
|
|
|
|
|
|
write_pending_messages() ;
|
|
|
|
// After shutdown print any late incoming messages immediately.
|
|
|
|
print_immediate = true ;
|
|
|
|
|
|
|
|
//TODO: delete memory
|
|
|
|
|
|
|
|
return 0 ;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Trick::MessageThreadedCout::dump( std::ostream & oss ) {
|
|
|
|
Trick::ThreadBase::dump(oss) ;
|
|
|
|
}
|
|
|
|
|