@@ -104,10 +104,13 @@ NetworkLoop::Tasks::ResolveEndpointAddress::get_address() const {
104104
105105NetworkLoop::NetworkLoop (core::IPool& packet_pool,
106106 core::IPool& buffer_pool,
107+ const int realtime_prio,
107108 core::IArena& arena)
108109 : packet_factory_(packet_pool, buffer_pool)
110+ , realtime_prio_(realtime_prio)
109111 , arena_(arena)
110112 , started_(false )
113+ , thr_init_cond_(thr_init_mutex_)
111114 , loop_initialized_(false )
112115 , stop_sem_initialized_(false )
113116 , task_sem_initialized_(false )
@@ -140,17 +143,15 @@ NetworkLoop::NetworkLoop(core::IPool& packet_pool,
140143 task_sem_.data = this ;
141144 task_sem_initialized_ = true ;
142145
143- if (!enable_realtime ()) {
144- roc_log (LogInfo,
145- " network loop: can't set realtime priority of network thread. May need "
146- " to be root" );
147- }
148146 if (!(started_ = Thread::start ())) {
149147 init_status_ = status::StatusErrThread;
150148 return ;
151149 }
152150
153- init_status_ = status::StatusOK;
151+ while (init_status_ == status::NoStatus) {
152+ core::Mutex::Lock lock (thr_init_mutex_);
153+ thr_init_cond_.wait ();
154+ }
154155}
155156
156157NetworkLoop::~NetworkLoop () {
@@ -285,6 +286,21 @@ void NetworkLoop::handle_resolved(ResolverRequest& req) {
285286
286287void NetworkLoop::run () {
287288 roc_log (LogDebug, " network loop: starting event loop" );
289+ if (realtime_prio_ > 0 && !enable_realtime (realtime_prio_)) {
290+ core::Mutex::Lock lock (thr_init_mutex_);
291+
292+ roc_log (LogError,
293+ " network loop: can't set realtime priority of network thread. May need "
294+ " to be root" );
295+ init_status_ = status::StatusFailedRealtime;
296+ thr_init_cond_.signal ();
297+ } else {
298+ core::Mutex::Lock lock (thr_init_mutex_);
299+
300+ roc_log (LogDebug, " network loop: elevated realtime priority" );
301+ init_status_ = status::StatusOK;
302+ thr_init_cond_.signal ();
303+ }
288304
289305 int err = uv_run (&loop_, UV_RUN_DEFAULT);
290306 if (err != 0 ) {
0 commit comments