64 void Create(ArgType arg,
void (*function)(ArgType arg),
const char *name,
68 pthread_attr_init(&attr);
71 size_t stack_size =
LibXR::max(
static_cast<size_t>(PTHREAD_STACK_MIN), stack_depth);
72 pthread_attr_setstacksize(&attr, stack_size);
88 ThreadBlock(
decltype(function) fun, ArgType arg,
const char *name)
91 name_(
reinterpret_cast<char *
>(malloc(strlen(name) + 1)))
96 ~ThreadBlock() { free(name_); }
105 static void *Port(
void *arg)
107 ThreadBlock *block =
static_cast<ThreadBlock *
>(arg);
108 volatile const char *thread_name = block->name_;
109 block->fun_(block->arg_);
113 return static_cast<void *
>(
nullptr);
116 decltype(function) fun_;
121 auto block =
new ThreadBlock(function, arg, name);
124 int min_priority = sched_get_priority_min(SCHED_FIFO);
125 int max_priority = sched_get_priority_max(SCHED_FIFO);
126 bool scheduling_set =
false;
128 UNUSED(scheduling_set);
132 pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
133 pthread_attr_setschedpolicy(&attr, SCHED_FIFO);
135 struct sched_param sp;
136 memset(&sp, 0,
sizeof(sp));
137 sp.sched_priority = min_priority +
static_cast<int>(priority);
139 if (pthread_attr_setschedparam(&attr, &sp) == 0)
141 scheduling_set =
true;
145 XR_LOG_WARN(
"Failed to set thread priority. Falling back to default policy.");
146 pthread_attr_setschedpolicy(&attr, SCHED_OTHER);
147 pthread_attr_setinheritsched(&attr, PTHREAD_INHERIT_SCHED);
153 "SCHED_FIFO not supported or insufficient range. Using default policy.");
154 pthread_attr_setinheritsched(&attr, PTHREAD_INHERIT_SCHED);
158 int ans = pthread_create(&this->
thread_handle_, &attr, block->Port, block);
161 XR_LOG_WARN(
"Failed to create thread: %s (%s), Falling back to default policy.",
162 name, strerror(ans));
163 pthread_attr_setschedpolicy(&attr, SCHED_OTHER);
164 pthread_attr_setinheritsched(&attr, PTHREAD_INHERIT_SCHED);
165 ans = pthread_create(&this->
thread_handle_, &attr, block->Port, block);
168 XR_LOG_ERROR(
"Failed to create thread: %s (%s)", name, strerror(ans));
173 pthread_attr_destroy(&attr);