66 void Create(ArgType arg,
void (*function)(ArgType arg),
const char *name,
70 pthread_attr_init(&attr);
73 size_t stack_size =
LibXR::max(
static_cast<size_t>(PTHREAD_STACK_MIN), stack_depth);
74 pthread_attr_setstacksize(&attr, stack_size);
90 ThreadBlock(
decltype(function) fun, ArgType arg,
const char *name)
93 name_(
reinterpret_cast<char *
>(malloc(strlen(name) + 1)))
98 ~ThreadBlock() { free(name_); }
107 static void *Port(
void *arg)
109 ThreadBlock *block =
static_cast<ThreadBlock *
>(arg);
111 if (block->name_ && block->name_[0] !=
'\0')
114 std::strncpy(name_buf, block->name_,
sizeof(name_buf) - 1);
115 name_buf[
sizeof(name_buf) - 1] =
'\0';
116 pthread_setname_np(pthread_self(), name_buf);
119 volatile const char *thread_name = block->name_;
120 block->fun_(block->arg_);
124 return static_cast<void *
>(
nullptr);
127 decltype(function) fun_;
132 auto block =
new ThreadBlock(function, arg, name);
135 int min_priority = sched_get_priority_min(SCHED_FIFO);
136 int max_priority = sched_get_priority_max(SCHED_FIFO);
137 bool scheduling_set =
false;
139 UNUSED(scheduling_set);
143 pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
144 pthread_attr_setschedpolicy(&attr, SCHED_FIFO);
146 struct sched_param sp;
148 sp.sched_priority = min_priority +
static_cast<int>(priority);
150 if (pthread_attr_setschedparam(&attr, &sp) == 0)
152 scheduling_set =
true;
156 XR_LOG_WARN(
"Failed to set thread priority. Falling back to default policy.");
157 pthread_attr_setschedpolicy(&attr, SCHED_OTHER);
158 pthread_attr_setinheritsched(&attr, PTHREAD_INHERIT_SCHED);
164 "SCHED_FIFO not supported or insufficient range. Using default policy.");
165 pthread_attr_setinheritsched(&attr, PTHREAD_INHERIT_SCHED);
169 int ans = pthread_create(&this->
thread_handle_, &attr, ThreadBlock::Port, block);
171 pthread_attr_destroy(&attr);
175 XR_LOG_WARN(
"Failed to create thread: %s (%s), retrying with default attributes.",
176 name, strerror(ans));
179 ans = pthread_create(&this->
thread_handle_,
nullptr, ThreadBlock::Port, block);
183 XR_LOG_ERROR(
"Failed to create thread: %s (%s)", name, strerror(ans));
188 pthread_attr_destroy(&attr);