@@ -79,6 +79,19 @@ void unity_server::start(const unity_server_initializer& server_initializer) {
7979 server->start ();
8080 logstream (LOG_EMPH ) << " Unity server listening on: " << options.server_address << std::endl;
8181 logstream (LOG_EMPH ) << " Total System Memory Detected: " << total_mem () << std::endl;
82+ log_thread.launch ([=]() {
83+ do {
84+ std::pair<std::string, bool > queueelem = this ->log_queue .dequeue ();
85+ if (queueelem.second == false ) {
86+ break ;
87+ } else {
88+ // we need to read it before trying to do the callback
89+ // Otherwise we might accidentally call a null pointer
90+ volatile progress_callback_type cback = this ->log_progress_callback ;
91+ if (cback != nullptr ) cback (queueelem.first );
92+ }
93+ } while (1 );
94+ });
8295}
8396
8497/* *
@@ -88,6 +101,7 @@ void unity_server::stop() {
88101 delete server;
89102 server = nullptr ;
90103 set_log_progress (false );
104+ log_queue.stop_blocking ();
91105 graphlab::global_teardown::get_instance ().perform_teardown ();
92106}
93107
@@ -142,5 +156,18 @@ void unity_server::set_log_progress(bool enable) {
142156 }
143157}
144158
159+ void unity_server::set_log_progress_callback (void (*callback)(std::string)) {
160+ if (callback == nullptr ) {
161+ log_progress_callback = nullptr ;
162+ global_logger ().add_observer (LOG_PROGRESS , NULL );
163+ } else {
164+ log_progress_callback = callback;
165+ global_logger ().add_observer (
166+ LOG_PROGRESS ,
167+ [=](int lineloglevel, const char * buf, size_t len){
168+ this ->log_queue .enqueue (std::string (buf, len));
169+ });
170+ }
171+ }
145172
146173} // end of graphlab
0 commit comments