Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pthread: remove enter_critical_section in pthread_mutex #15126

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions sched/pthread/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion sched/pthread/Make.defs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
60 changes: 56 additions & 4 deletions sched/pthread/pthread_mutex.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,12 @@
#include "sched/sched.h"
#include "pthread/pthread.h"

/****************************************************************************
* Private Data
****************************************************************************/

static spinlock_t g_mutex_lock = SP_UNLOCKED;

/****************************************************************************
* Private Functions
****************************************************************************/
Expand Down Expand Up @@ -65,10 +71,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(&g_mutex_lock);
mutex->flink = rtcb->mhead;
rtcb->mhead = mutex;
leave_critical_section(flags);
spin_unlock_irqrestore(&g_mutex_lock, flags);
}

/****************************************************************************
Expand All @@ -92,7 +98,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(&g_mutex_lock);

/* Remove the mutex from the list of mutexes held by this task */

Expand All @@ -118,7 +124,7 @@ static void pthread_mutex_remove(FAR struct pthread_mutex_s *mutex)
}

mutex->flink = NULL;
leave_critical_section(flags);
spin_unlock_irqrestore(&g_mutex_lock, flags);
}

/****************************************************************************
Expand Down Expand Up @@ -346,3 +352,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(&g_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(&g_mutex_lock, flags);
}
89 changes: 0 additions & 89 deletions sched/pthread/pthread_mutexinconsistent.c

This file was deleted.

Loading