diff options
Diffstat (limited to 'src/ipcpd/normal/fa.c')
-rw-r--r-- | src/ipcpd/normal/fa.c | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/src/ipcpd/normal/fa.c b/src/ipcpd/normal/fa.c index e03467c2..76942143 100644 --- a/src/ipcpd/normal/fa.c +++ b/src/ipcpd/normal/fa.c @@ -306,15 +306,44 @@ void fa_fini(void) int fa_start(void) { + struct sched_param par; + int pol; + int max; + fa.psched = psched_create(packet_handler); - if (fa.psched == NULL) + if (fa.psched == NULL) { + log_err("Failed to start packet scheduler."); goto fail_psched; + } - if (pthread_create(&fa.worker, NULL, fa_handle_packet, NULL)) + if (pthread_create(&fa.worker, NULL, fa_handle_packet, NULL)) { + log_err("Failed to create worker thread."); goto fail_thread; + } + + if (pthread_getschedparam(fa.worker, &pol, &par)) { + log_err("Failed to get worker thread scheduling parameters."); + goto fail_sched; + } + + max = sched_get_priority_max(pol); + if (max < 0) { + log_err("Failed to get max priority for scheduler."); + goto fail_sched; + } + + par.sched_priority = max; + + if (pthread_setschedparam(fa.worker, pol, &par)) { + log_err("Failed to set scheduler priority to maximum."); + goto fail_sched; + } return 0; + fail_sched: + pthread_cancel(fa.worker); + pthread_join(fa.worker, NULL); fail_thread: psched_destroy(fa.psched); fail_psched: |