+uint8_t nr5g_fapi_prepare_thread(
+ nr5g_fapi_thread_params_t* thread_params,
+ char* thread_name,
+ void* thread_fun(void*))
+{
+ struct sched_param param;
+ pthread_attr_t* p_thread_attr = &thread_params->thread_info.thread_attr;
+ pthread_attr_init(p_thread_attr);
+ if (!pthread_attr_getschedparam(p_thread_attr, ¶m)) {
+ param.sched_priority = thread_params->thread_worker.thread_priority;
+ pthread_attr_setschedparam(p_thread_attr, ¶m);
+ pthread_attr_setschedpolicy(p_thread_attr, SCHED_FIFO);
+ }
+
+ if (0 != pthread_create(&thread_params->thread_info.thread_id,
+ p_thread_attr, thread_fun, (void *)
+ nr5g_fapi_get_nr5g_fapi_phy_ctx())) {
+ printf("Error: Unable to create threads\n");
+ if (p_thread_attr)
+ pthread_attr_destroy(p_thread_attr);
+ return FAILURE;
+ }
+ pthread_setname_np(thread_params->thread_info.thread_id,
+ thread_name);
+
+ return SUCCESS;
+}
+
+uint8_t nr5g_fapi_initialise_sempahore(
+ nr5g_fapi_urllc_thread_params_t* urllc_thread_params)
+{
+ memset(&urllc_thread_params->urllc_sem_process, 0, sizeof(sem_t));
+ memset(&urllc_thread_params->urllc_sem_done, 0, sizeof(sem_t));
+
+ pthread_mutex_init(&urllc_thread_params->lock, NULL);
+ urllc_thread_params->p_urllc_list_elem = NULL;
+ if (0 != sem_init(&urllc_thread_params->urllc_sem_process, 0, 0)) {
+ printf("Error: Unable to init urllc_sem_process semaphore\n");
+ return FAILURE;
+ }
+ if (0 != sem_init(&urllc_thread_params->urllc_sem_done, 0, 1)) {
+ printf("Error: Unable to init urllc_sem_done semaphore\n");
+ return FAILURE;
+ }
+
+ return SUCCESS;
+}
+
+void nr5g_fapi_init_thread(uint8_t worker_core_id)
+{
+ cpu_set_t cpuset;
+ pthread_t thread = pthread_self();
+
+ CPU_ZERO(&cpuset);
+ CPU_SET(worker_core_id, &cpuset);
+ pthread_setaffinity_np(thread, sizeof(cpu_set_t), &cpuset);
+
+ usleep(1000);
+}
+
+void nr5g_fapi_urllc_thread_callback(
+ void *p_list_elem,
+ nr5g_fapi_urllc_thread_params_t* urllc_params)
+{
+ if (nr5g_fapi_get_nr5g_fapi_phy_ctx()->is_urllc_enabled){
+ sem_wait(&urllc_params->urllc_sem_done);
+ pthread_mutex_lock(&urllc_params->lock);
+ urllc_params->p_urllc_list_elem = p_list_elem;
+ pthread_mutex_unlock(&urllc_params->lock);
+ sem_post(&urllc_params->urllc_sem_process);
+ }
+ else {
+ NR5G_FAPI_LOG(ERROR_LOG, ("[URLLC] Threads are not running"));
+ }
+}
+