You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2021/07/28 04:01:45 UTC
[incubator-nuttx] 01/04: sched/wqueue: merge kwork_lpthread.c and
kwork_hpthread.c to kwork_thread.c
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit a0c3a0923a17cacafecdceb4bd4522011ac435ad
Author: Jiuzhu Dong <do...@xiaomi.com>
AuthorDate: Fri Jun 25 14:24:45 2021 +0800
sched/wqueue: merge kwork_lpthread.c and kwork_hpthread.c to kwork_thread.c
Signed-off-by: Jiuzhu Dong <do...@xiaomi.com>
---
sched/wqueue/Make.defs | 12 +-
sched/wqueue/kwork_lpthread.c | 171 ----------------------
sched/wqueue/kwork_notifier.c | 1 -
sched/wqueue/{kwork_hpthread.c => kwork_thread.c} | 163 ++++++++++++++-------
4 files changed, 114 insertions(+), 233 deletions(-)
diff --git a/sched/wqueue/Make.defs b/sched/wqueue/Make.defs
index 5e8bd86..bc31d53 100644
--- a/sched/wqueue/Make.defs
+++ b/sched/wqueue/Make.defs
@@ -23,21 +23,11 @@
ifeq ($(CONFIG_SCHED_WORKQUEUE),y)
CSRCS += kwork_queue.c kwork_process.c kwork_cancel.c kwork_signal.c
+CSRCS += kwork_thread.c
-# Add high priority work queue files
-
-ifeq ($(CONFIG_SCHED_HPWORK),y)
-CSRCS += kwork_hpthread.c
-endif
-
-# Add low priority work queue files
-
-ifeq ($(CONFIG_SCHED_LPWORK),y)
-CSRCS += kwork_lpthread.c
ifeq ($(CONFIG_PRIORITY_INHERITANCE),y)
CSRCS += kwork_inherit.c
endif # CONFIG_PRIORITY_INHERITANCE
-endif # CONFIG_SCHED_LPWORK
# Add work queue notifier support
diff --git a/sched/wqueue/kwork_lpthread.c b/sched/wqueue/kwork_lpthread.c
deleted file mode 100644
index 0cea4a3..0000000
--- a/sched/wqueue/kwork_lpthread.c
+++ /dev/null
@@ -1,171 +0,0 @@
-/****************************************************************************
- * 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 <nuttx/config.h>
-
-#include <unistd.h>
-#include <sched.h>
-#include <string.h>
-#include <assert.h>
-#include <errno.h>
-#include <queue.h>
-#include <debug.h>
-
-#include <nuttx/wqueue.h>
-#include <nuttx/kthread.h>
-#include <nuttx/kmalloc.h>
-#include <nuttx/clock.h>
-
-#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 */
diff --git a/sched/wqueue/kwork_notifier.c b/sched/wqueue/kwork_notifier.c
index 012e3bb..09cb1a6 100644
--- a/sched/wqueue/kwork_notifier.c
+++ b/sched/wqueue/kwork_notifier.c
@@ -33,7 +33,6 @@
#include <assert.h>
#include <nuttx/kmalloc.h>
-#include <nuttx/semaphore.h>
#include <nuttx/wqueue.h>
#include "wqueue/wqueue.h"
diff --git a/sched/wqueue/kwork_hpthread.c b/sched/wqueue/kwork_thread.c
similarity index 53%
rename from sched/wqueue/kwork_hpthread.c
rename to sched/wqueue/kwork_thread.c
index e44efe8..3c3b7eb 100644
--- a/sched/wqueue/kwork_hpthread.c
+++ b/sched/wqueue/kwork_thread.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * sched/wqueue/kwork_hpthread.c
+ * sched/wqueue/kwork_thread.c
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
@@ -26,7 +26,9 @@
#include <unistd.h>
#include <sched.h>
+#include <stdio.h>
#include <string.h>
+#include <stdlib.h>
#include <errno.h>
#include <assert.h>
#include <queue.h>
@@ -34,27 +36,33 @@
#include <nuttx/wqueue.h>
#include <nuttx/kthread.h>
-#include <nuttx/kmalloc.h>
-#include <nuttx/clock.h>
#include "wqueue/wqueue.h"
-#ifdef CONFIG_SCHED_HPWORK
+#if defined(CONFIG_SCHED_WORKQUEUE)
/****************************************************************************
* Public Data
****************************************************************************/
+#if defined(CONFIG_SCHED_HPWORK)
/* The state of the kernel mode, high priority work queue(s). */
struct hp_wqueue_s g_hpwork;
+#endif /* CONFIG_SCHED_HPWORK */
+
+#if defined(CONFIG_SCHED_LPWORK)
+/* The state of the kernel mode, low priority work queue(s). */
+
+struct lp_wqueue_s g_lpwork;
+#endif /* CONFIG_SCHED_LPWORK */
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
- * Name: work_hpthread
+ * Name: work_thread
*
* Description:
* These are the worker threads that performs the actions placed on the
@@ -75,26 +83,14 @@ struct hp_wqueue_s g_hpwork;
*
****************************************************************************/
-static int work_hpthread(int argc, char *argv[])
+static int work_thread(int argc, char *argv[])
{
- int wndx = 0;
-#if CONFIG_SCHED_HPNTHREADS > 1
- pid_t me = getpid();
- int i;
-
- /* Find out thread index by search the workers in g_hpwork */
-
- for (wndx = 0, i = 0; i < CONFIG_SCHED_HPNTHREADS; i++)
- {
- if (g_hpwork.worker[i].pid == me)
- {
- wndx = i;
- break;
- }
- }
+ FAR struct kwork_wqueue_s *queue;
+ int wndx;
- DEBUGASSERT(i < CONFIG_SCHED_HPNTHREADS);
-#endif
+ queue = (FAR struct kwork_wqueue_s *)
+ ((uintptr_t)strtoul(argv[1], NULL, 0));
+ wndx = atoi(argv[2]);
/* Loop forever */
@@ -105,67 +101,134 @@ static int work_hpthread(int argc, char *argv[])
* triggered, or delayed work expires.
*/
- work_process((FAR struct kwork_wqueue_s *)&g_hpwork, wndx);
+ work_process(queue, wndx);
}
return OK; /* To keep some compilers happy */
}
/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: work_start_highpri
+ * Name: work_thread_create
*
* Description:
- * Start the high-priority, kernel-mode worker thread(s)
+ * This function creates and activates a work thread task with kernel-
+ * mode privileges.
*
* Input Parameters:
- * None
+ * name - Name of the new task
+ * priority - Priority of the new task
+ * stack_size - size (in bytes) of the stack needed
+ * nthread - Number of work thread should be created
+ * wqueue - Work queue instance
*
* Returned Value:
- * The task ID of the worker thread is returned on success. A negated
- * errno value is returned on failure.
+ * A negated errno value is returned on failure.
*
****************************************************************************/
-int work_start_highpri(void)
+static int work_thread_create(FAR const char *name, int priority,
+ int stack_size, int nthread,
+ FAR struct kwork_wqueue_s *wqueue)
{
- pid_t pid;
+ FAR char *argv[3];
+ char args[2][16];
int wndx;
+ int pid;
+
+ snprintf(args[0], 16, "0x%" PRIxPTR, (uintptr_t)wqueue);
+ argv[0] = args[0];
+ argv[2] = NULL;
/* Don't permit any of the threads to run until we have fully initialized
- * g_hpwork.
+ * g_hpwork and g_lpwork.
*/
sched_lock();
- /* Start the high-priority, kernel mode worker thread(s) */
-
- sinfo("Starting high-priority kernel worker thread(s)\n");
-
- for (wndx = 0; wndx < CONFIG_SCHED_HPNTHREADS; wndx++)
+ for (wndx = 0; wndx < nthread; wndx++)
{
- pid = kthread_create(HPWORKNAME, CONFIG_SCHED_HPWORKPRIORITY,
- CONFIG_SCHED_HPWORKSTACKSIZE,
- (main_t)work_hpthread,
- (FAR char * const *)NULL);
+ snprintf(args[1], 16, "%d", wndx);
+ argv[1] = args[1];
+
+ pid = kthread_create(name, priority, stack_size,
+ (main_t)work_thread, argv);
DEBUGASSERT(pid > 0);
if (pid < 0)
{
- serr("ERROR: kthread_create %d failed: %d\n", wndx, (int)pid);
+ serr("ERROR: work_thread_create %d failed: %d\n", wndx, pid);
sched_unlock();
- return (int)pid;
+ return pid;
}
- g_hpwork.worker[wndx].pid = pid;
- g_hpwork.worker[wndx].busy = true;
+#ifdef CONFIG_PRIORITY_INHERITANCE
+ wqueue->worker[wndx].pid = pid;
+#endif
+ wqueue->worker[wndx].busy = true;
}
sched_unlock();
- return g_hpwork.worker[0].pid;
+ return OK;
}
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: work_start_highpri
+ *
+ * Description:
+ * Start the high-priority, kernel-mode worker thread(s)
+ *
+ * Input Parameters:
+ * None
+ *
+ * Returned Value:
+ * A negated errno value is returned on failure.
+ *
+ ****************************************************************************/
+
+#if defined(CONFIG_SCHED_HPWORK)
+int work_start_highpri(void)
+{
+ /* Start the high-priority, kernel mode worker thread(s) */
+
+ sinfo("Starting high-priority kernel worker thread(s)\n");
+
+ return work_thread_create(HPWORKNAME, CONFIG_SCHED_HPWORKPRIORITY,
+ CONFIG_SCHED_HPWORKSTACKSIZE,
+ CONFIG_SCHED_HPNTHREADS,
+ (FAR struct kwork_wqueue_s *)&g_hpwork);
+}
#endif /* CONFIG_SCHED_HPWORK */
+
+/****************************************************************************
+ * Name: work_start_lowpri
+ *
+ * Description:
+ * Start the low-priority, kernel-mode worker thread(s)
+ *
+ * Input Parameters:
+ * None
+ *
+ * Returned Value:
+ * A negated errno value is returned on failure.
+ *
+ ****************************************************************************/
+
+#if defined(CONFIG_SCHED_LPWORK)
+int work_start_lowpri(void)
+{
+ /* Start the low-priority, kernel mode worker thread(s) */
+
+ sinfo("Starting low-priority kernel worker thread(s)\n");
+
+ return work_thread_create(LPWORKNAME, CONFIG_SCHED_LPWORKPRIORITY,
+ CONFIG_SCHED_LPWORKSTACKSIZE,
+ CONFIG_SCHED_LPNTHREADS,
+ (FAR struct kwork_wqueue_s *)&g_lpwork);
+}
+#endif /* CONFIG_SCHED_LPWORK */
+
+#endif /* CONFIG_SCHED_WORKQUEUE */