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/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 5f4a15b690 pthread: remove enter_critical_section in pthread_mutex
5f4a15b690 is described below
commit 5f4a15b690d31776081f1bf1f28103863a88e38b
Author: hujun5 <[email protected]>
AuthorDate: Thu Oct 24 14:20:28 2024 +0800
pthread: remove enter_critical_section in pthread_mutex
reason:
We would like to replace the critical section with a small lock.
Signed-off-by: hujun5 <[email protected]>
---
include/nuttx/sched.h | 5 ++
sched/init/nx_start.c | 4 ++
sched/pthread/CMakeLists.txt | 3 +-
sched/pthread/Make.defs | 2 +-
sched/pthread/pthread_create.c | 4 ++
sched/pthread/pthread_mutex.c | 54 +++++++++++++++++--
sched/pthread/pthread_mutexinconsistent.c | 89 -------------------------------
sched/task/task_fork.c | 4 ++
sched/task/task_init.c | 4 ++
9 files changed, 73 insertions(+), 96 deletions(-)
diff --git a/include/nuttx/sched.h b/include/nuttx/sched.h
index e2507f9938..68284461a6 100644
--- a/include/nuttx/sched.h
+++ b/include/nuttx/sched.h
@@ -48,6 +48,7 @@
#include <nuttx/net/net.h>
#include <nuttx/mm/map.h>
#include <nuttx/tls.h>
+#include <nuttx/spinlock_type.h>
#include <arch/arch.h>
@@ -737,6 +738,10 @@ struct tcb_s
size_t level_deepest;
size_t level;
#endif
+
+#ifndef CONFIG_PTHREAD_MUTEX_UNSAFE
+ spinlock_t mutex_lock;
+#endif
};
/* struct task_tcb_s ********************************************************/
diff --git a/sched/init/nx_start.c b/sched/init/nx_start.c
index 01ba4df823..5602caf9b0 100644
--- a/sched/init/nx_start.c
+++ b/sched/init/nx_start.c
@@ -469,6 +469,10 @@ static void idle_group_initialize(void)
nxtask_joininit(tcb);
+#ifndef CONFIG_PTHREAD_MUTEX_UNSAFE
+ spin_lock_init(&tcb->mutex_lock);
+#endif
+
#ifdef CONFIG_SMP
/* Create a stack for all CPU IDLE threads (except CPU0 which already
* has a stack).
diff --git a/sched/pthread/CMakeLists.txt b/sched/pthread/CMakeLists.txt
index 2ccf5d358f..6921bfe6f6 100644
--- a/sched/pthread/CMakeLists.txt
+++ b/sched/pthread/CMakeLists.txt
@@ -46,8 +46,7 @@ if(NOT CONFIG_DISABLE_PTHREAD)
pthread_setschedprio.c)
if(NOT CONFIG_PTHREAD_MUTEX_UNSAFE)
- list(APPEND SRCS pthread_mutex.c pthread_mutexconsistent.c
- pthread_mutexinconsistent.c)
+ list(APPEND SRCS pthread_mutex.c pthread_mutexconsistent.c)
endif()
if(CONFIG_SMP)
diff --git a/sched/pthread/Make.defs b/sched/pthread/Make.defs
index bff1a88da1..4a696068fa 100644
--- a/sched/pthread/Make.defs
+++ b/sched/pthread/Make.defs
@@ -32,7 +32,7 @@ CSRCS += pthread_completejoin.c pthread_findjoininfo.c
CSRCS += pthread_release.c pthread_setschedprio.c
ifneq ($(CONFIG_PTHREAD_MUTEX_UNSAFE),y)
-CSRCS += pthread_mutex.c pthread_mutexconsistent.c pthread_mutexinconsistent.c
+CSRCS += pthread_mutex.c pthread_mutexconsistent.c
endif
ifeq ($(CONFIG_SMP),y)
diff --git a/sched/pthread/pthread_create.c b/sched/pthread/pthread_create.c
index e9ff4ef88c..80d74fec50 100644
--- a/sched/pthread/pthread_create.c
+++ b/sched/pthread/pthread_create.c
@@ -222,6 +222,10 @@ int nx_pthread_create(pthread_trampoline_t trampoline, FAR
pthread_t *thread,
nxtask_joininit(&ptcb->cmn);
+#ifndef CONFIG_PTHREAD_MUTEX_UNSAFE
+ spin_lock_init(&ptcb->cmn.mutex_lock);
+#endif
+
/* Bind the parent's group to the new TCB (we have not yet joined the
* group).
*/
diff --git a/sched/pthread/pthread_mutex.c b/sched/pthread/pthread_mutex.c
index 36eae29a08..24a063908f 100644
--- a/sched/pthread/pthread_mutex.c
+++ b/sched/pthread/pthread_mutex.c
@@ -65,10 +65,10 @@ static void pthread_mutex_add(FAR struct pthread_mutex_s
*mutex)
/* Add the mutex to the list of mutexes held by this pthread */
- flags = enter_critical_section();
+ flags = spin_lock_irqsave(&rtcb->mutex_lock);
mutex->flink = rtcb->mhead;
rtcb->mhead = mutex;
- leave_critical_section(flags);
+ spin_unlock_irqrestore(&rtcb->mutex_lock, flags);
}
/****************************************************************************
@@ -92,7 +92,7 @@ static void pthread_mutex_remove(FAR struct pthread_mutex_s
*mutex)
FAR struct pthread_mutex_s *prev;
irqstate_t flags;
- flags = enter_critical_section();
+ flags = spin_lock_irqsave(&rtcb->mutex_lock);
/* Remove the mutex from the list of mutexes held by this task */
@@ -118,7 +118,7 @@ static void pthread_mutex_remove(FAR struct pthread_mutex_s
*mutex)
}
mutex->flink = NULL;
- leave_critical_section(flags);
+ spin_unlock_irqrestore(&rtcb->mutex_lock, flags);
}
/****************************************************************************
@@ -346,3 +346,49 @@ int pthread_mutex_restorelock(FAR struct pthread_mutex_s
*mutex,
return ret;
}
+
+/****************************************************************************
+ * Name: pthread_mutex_inconsistent
+ *
+ * Description:
+ * This function is called when a pthread is terminated via either
+ * pthread_exit() or pthread_cancel(). It will check for any mutexes
+ * held by exitting thread. It will mark them as inconsistent and
+ * then wake up the highest priority waiter for the mutex. That
+ * instance of pthread_mutex_lock() will then return EOWNERDEAD.
+ *
+ * Input Parameters:
+ * tcb -- a reference to the TCB of the exitting pthread.
+ *
+ * Returned Value:
+ * None.
+ *
+ ****************************************************************************/
+
+void pthread_mutex_inconsistent(FAR struct tcb_s *tcb)
+{
+ FAR struct pthread_mutex_s *mutex;
+ irqstate_t flags;
+
+ DEBUGASSERT(tcb != NULL);
+
+ flags = spin_lock_irqsave(&tcb->mutex_lock);
+
+ /* Remove and process each mutex held by this task */
+
+ while (tcb->mhead != NULL)
+ {
+ /* Remove the mutex from the TCB list */
+
+ mutex = tcb->mhead;
+ tcb->mhead = mutex->flink;
+ mutex->flink = NULL;
+
+ /* Mark the mutex as INCONSISTENT and wake up any waiting thread */
+
+ mutex->flags |= _PTHREAD_MFLAGS_INCONSISTENT;
+ mutex_unlock(&mutex->mutex);
+ }
+
+ spin_unlock_irqrestore(&tcb->mutex_lock, flags);
+}
diff --git a/sched/pthread/pthread_mutexinconsistent.c
b/sched/pthread/pthread_mutexinconsistent.c
deleted file mode 100644
index c946edfb2e..0000000000
--- a/sched/pthread/pthread_mutexinconsistent.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/****************************************************************************
- * sched/pthread/pthread_mutexinconsistent.c
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * 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 <pthread.h>
-#include <sched.h>
-#include <assert.h>
-#include <errno.h>
-
-#include <nuttx/sched.h>
-#include <nuttx/semaphore.h>
-
-#include "pthread/pthread.h"
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: pthread_mutex_inconsistent
- *
- * Description:
- * This function is called when a pthread is terminated via either
- * pthread_exit() or pthread_cancel(). It will check for any mutexes
- * held by exitting thread. It will mark them as inconsistent and
- * then wake up the highest priority waiter for the mutex. That
- * instance of pthread_mutex_lock() will then return EOWNERDEAD.
- *
- * Input Parameters:
- * tcb -- a reference to the TCB of the exitting pthread.
- *
- * Returned Value:
- * None.
- *
- ****************************************************************************/
-
-void pthread_mutex_inconsistent(FAR struct tcb_s *tcb)
-{
- FAR struct pthread_mutex_s *mutex;
- irqstate_t flags;
-
- DEBUGASSERT(tcb != NULL);
-
- sched_lock();
-
- /* Remove and process each mutex held by this task */
-
- while (tcb->mhead != NULL)
- {
- /* Remove the mutex from the TCB list */
-
- flags = enter_critical_section();
- mutex = tcb->mhead;
- tcb->mhead = mutex->flink;
- mutex->flink = NULL;
- leave_critical_section(flags);
-
- /* Mark the mutex as INCONSISTENT and wake up any waiting thread */
-
- mutex->flags |= _PTHREAD_MFLAGS_INCONSISTENT;
- mutex_unlock(&mutex->mutex);
- }
-
- sched_unlock();
-}
diff --git a/sched/task/task_fork.c b/sched/task/task_fork.c
index 44551f32d4..39dd755f40 100644
--- a/sched/task/task_fork.c
+++ b/sched/task/task_fork.c
@@ -164,6 +164,10 @@ FAR struct task_tcb_s *nxtask_setup_fork(start_t retaddr)
nxtask_joininit(&child->cmn);
+#ifndef CONFIG_PTHREAD_MUTEX_UNSAFE
+ spin_lock_init(&child->cmn.mutex_lock);
+#endif
+
/* Allocate a new task group with the same privileges as the parent */
ret = group_initialize(child, ttype);
diff --git a/sched/task/task_init.c b/sched/task/task_init.c
index bcf8b30811..7d338f53b2 100644
--- a/sched/task/task_init.c
+++ b/sched/task/task_init.c
@@ -126,6 +126,10 @@ int nxtask_init(FAR struct task_tcb_s *tcb, const char
*name, int priority,
nxtask_joininit(&tcb->cmn);
#endif
+#ifndef CONFIG_PTHREAD_MUTEX_UNSAFE
+ spin_lock_init(&tcb->cmn.mutex_lock);
+#endif
+
/* Duplicate the parent tasks environment */
ret = env_dup(tcb->cmn.group, envp);