diff --git a/sched/wqueue/kwork_lpthread.c b/sched/wqueue/kwork_lpthread.c new file mode 100644 index 00000000000..611c8c61c92 --- /dev/null +++ b/sched/wqueue/kwork_lpthread.c @@ -0,0 +1,170 @@ +/**************************************************************************** + * sched/wqueue/kwork_lpthread.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "wqueue/wqueue.h" + +#ifdef CONFIG_SCHED_LPWORK + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +/* The state of the kernel mode, low priority work queue(s). */ + +struct lp_wqueue_s g_lpwork; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: work_lpthread + * + * Description: + * These are the worker thread(s) that performs the actions placed on the + * low priority work queue. + * + * These, along with the higher priority worker thread are the kernel mode + * work queues (also build in the flat build). + * + * All kernel mode worker threads are started by the OS during normal + * bring up. This entry point is referenced by OS internally and should + * not be accessed by application logic. + * + * Input Parameters: + * argc, argv (not used) + * + * Returned Value: + * Does not return + * + ****************************************************************************/ + +static int work_lpthread(int argc, char *argv[]) +{ + int wndx = 0; +#if CONFIG_SCHED_LPNTHREADS > 1 + pid_t me = getpid(); + int i; + + /* Find out thread index by search the workers in g_lpwork */ + + for (wndx = 0, i = 0; i < CONFIG_SCHED_LPNTHREADS; i++) + { + if (g_lpwork.worker[i].pid == me) + { + wndx = i; + break; + } + } + + DEBUGASSERT(i < CONFIG_SCHED_LPNTHREADS); +#endif + + /* Loop forever */ + + for (; ; ) + { + /* Then process queued work. work_process will not return until: + * (1) there is no further work in the work queue, and (2) signal is + * triggered, or delayed work expires. + */ + + work_process((FAR struct kwork_wqueue_s *)&g_lpwork, wndx); + } + + return OK; /* To keep some compilers happy */ +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: work_start_lowpri + * + * Description: + * Start the low-priority, kernel-mode worker thread(s) + * + * Input Parameters: + * None + * + * Returned Value: + * The task ID of the worker thread is returned on success. A negated + * errno value is returned on failure. + * + ****************************************************************************/ + +int work_start_lowpri(void) +{ + pid_t pid; + int wndx; + + /* Don't permit any of the threads to run until we have fully initialized + * g_lpwork. + */ + + sched_lock(); + + /* Start the low-priority, kernel mode worker thread(s) */ + + sinfo("Starting low-priority kernel worker thread(s)\n"); + + for (wndx = 0; wndx < CONFIG_SCHED_LPNTHREADS; wndx++) + { + pid = kthread_create(LPWORKNAME, CONFIG_SCHED_LPWORKPRIORITY, + CONFIG_SCHED_LPWORKSTACKSIZE, + (main_t)work_lpthread, + (FAR char * const *)NULL); + + DEBUGASSERT(pid > 0); + if (pid < 0) + { + serr("ERROR: kthread_create %d failed: %d\n", wndx, (int)pid); + sched_unlock(); + return (int)pid; + } + + g_lpwork.worker[wndx].pid = pid; + g_lpwork.worker[wndx].busy = true; + } + + sched_unlock(); + return g_lpwork.worker[0].pid; +} + +#endif /* CONFIG_SCHED_LPWORK */