group: use tg_mutex to replace tg_joinlock

Signed-off-by: hujun5 <hujun5@xiaomi.com>
This commit is contained in:
hujun5 2025-01-19 10:55:59 +08:00 committed by Xiang Xiao
parent 544da3c64c
commit fcfc300f7a
8 changed files with 23 additions and 22 deletions

View file

@ -499,7 +499,6 @@ struct task_group_s
#ifndef CONFIG_DISABLE_PTHREAD #ifndef CONFIG_DISABLE_PTHREAD
/* Pthreads ***************************************************************/ /* Pthreads ***************************************************************/
rmutex_t tg_joinlock; /* Synchronize access to tg_joinqueue */
sq_queue_t tg_joinqueue; /* List of join status of tcb */ sq_queue_t tg_joinqueue; /* List of join status of tcb */
#endif #endif
@ -547,7 +546,8 @@ struct task_group_s
struct mm_map_s tg_mm_map; /* Task group virtual memory mappings */ struct mm_map_s tg_mm_map; /* Task group virtual memory mappings */
spinlock_t tg_lock; /* lock */ spinlock_t tg_lock; /* SpinLock for group */
rmutex_t tg_mutex; /* Mutex for group */
}; };
/* struct tcb_s *************************************************************/ /* struct tcb_s *************************************************************/

View file

@ -178,10 +178,11 @@ int group_initialize(FAR struct task_tcb_s *tcb, uint8_t ttype)
return ret; return ret;
} }
nxrmutex_init(&group->tg_mutex);
#ifndef CONFIG_DISABLE_PTHREAD #ifndef CONFIG_DISABLE_PTHREAD
/* Initialize the task group join */ /* Initialize the task group join */
nxrmutex_init(&group->tg_joinlock);
sq_init(&group->tg_joinqueue); sq_init(&group->tg_joinqueue);
#endif #endif

View file

@ -74,6 +74,10 @@
static inline void static inline void
group_release(FAR struct task_group_s *group, uint8_t ttype) group_release(FAR struct task_group_s *group, uint8_t ttype)
{ {
/* Destroy the mutex */
nxrmutex_destroy(&group->tg_mutex);
task_uninit_info(group); task_uninit_info(group);
#if defined(CONFIG_SCHED_HAVE_PARENT) && defined(CONFIG_SCHED_CHILD_STATUS) #if defined(CONFIG_SCHED_HAVE_PARENT) && defined(CONFIG_SCHED_CHILD_STATUS)

View file

@ -74,7 +74,7 @@ int pthread_completejoin(pid_t pid, FAR void *exit_value)
sinfo("pid=%d exit_value=%p\n", pid, exit_value); sinfo("pid=%d exit_value=%p\n", pid, exit_value);
nxrmutex_lock(&group->tg_joinlock); nxrmutex_lock(&group->tg_mutex);
if (!sq_empty(&tcb->join_queue)) if (!sq_empty(&tcb->join_queue))
{ {
@ -109,7 +109,7 @@ int pthread_completejoin(pid_t pid, FAR void *exit_value)
tcb->flags |= TCB_FLAG_JOIN_COMPLETED; tcb->flags |= TCB_FLAG_JOIN_COMPLETED;
nxrmutex_unlock(&group->tg_joinlock); nxrmutex_unlock(&group->tg_mutex);
return ret; return ret;
} }
@ -126,7 +126,7 @@ int pthread_completejoin(pid_t pid, FAR void *exit_value)
* no thread ever calls pthread_join. In case, there is a memory leak! * no thread ever calls pthread_join. In case, there is a memory leak!
* *
* Assumptions: * Assumptions:
* The caller holds tg_joinlock * The caller holds tg_mutex
* *
****************************************************************************/ ****************************************************************************/
@ -137,9 +137,9 @@ void pthread_destroyjoin(FAR struct task_group_s *group,
/* Remove the join info from the set of joins */ /* Remove the join info from the set of joins */
nxrmutex_lock(&group->tg_joinlock); nxrmutex_lock(&group->tg_mutex);
sq_rem(&pjoin->entry, &group->tg_joinqueue); sq_rem(&pjoin->entry, &group->tg_joinqueue);
nxrmutex_unlock(&group->tg_joinlock); nxrmutex_unlock(&group->tg_mutex);
/* And deallocate the pjoin structure */ /* And deallocate the pjoin structure */

View file

@ -70,7 +70,7 @@ int pthread_detach(pthread_t thread)
FAR struct tcb_s *tcb; FAR struct tcb_s *tcb;
int ret; int ret;
nxrmutex_lock(&group->tg_joinlock); nxrmutex_lock(&group->tg_mutex);
tcb = nxsched_get_tcb((pid_t)thread); tcb = nxsched_get_tcb((pid_t)thread);
if (tcb == NULL || (tcb->flags & TCB_FLAG_JOIN_COMPLETED) != 0) if (tcb == NULL || (tcb->flags & TCB_FLAG_JOIN_COMPLETED) != 0)
@ -102,7 +102,7 @@ int pthread_detach(pthread_t thread)
} }
errout: errout:
nxrmutex_unlock(&group->tg_joinlock); nxrmutex_unlock(&group->tg_mutex);
sinfo("Returning %d\n", ret); sinfo("Returning %d\n", ret);
return ret; return ret;

View file

@ -76,7 +76,7 @@ int pthread_findjoininfo(FAR struct task_group_s *group, pid_t pid,
FAR sq_entry_t *curr; FAR sq_entry_t *curr;
FAR sq_entry_t *next; FAR sq_entry_t *next;
nxrmutex_lock(&group->tg_joinlock); nxrmutex_lock(&group->tg_mutex);
sq_for_every_safe(&group->tg_joinqueue, curr, next) sq_for_every_safe(&group->tg_joinqueue, curr, next)
{ {
@ -88,7 +88,7 @@ int pthread_findjoininfo(FAR struct task_group_s *group, pid_t pid,
} }
} }
nxrmutex_unlock(&group->tg_joinlock); nxrmutex_unlock(&group->tg_mutex);
if (!create) if (!create)
{ {
@ -103,12 +103,12 @@ int pthread_findjoininfo(FAR struct task_group_s *group, pid_t pid,
join->pid = pid; join->pid = pid;
nxrmutex_lock(&group->tg_joinlock); nxrmutex_lock(&group->tg_mutex);
sq_addfirst(&join->entry, &group->tg_joinqueue); sq_addfirst(&join->entry, &group->tg_joinqueue);
found: found:
nxrmutex_unlock(&group->tg_joinlock); nxrmutex_unlock(&group->tg_mutex);
*pjoin = join; *pjoin = join;

View file

@ -83,7 +83,7 @@ int pthread_join(pthread_t thread, FAR pthread_addr_t *pexit_value)
enter_cancellation_point(); enter_cancellation_point();
nxrmutex_lock(&group->tg_joinlock); nxrmutex_lock(&group->tg_mutex);
tcb = nxsched_get_tcb((pid_t)thread); tcb = nxsched_get_tcb((pid_t)thread);
if (tcb == NULL || (tcb->flags & TCB_FLAG_JOIN_COMPLETED) != 0) if (tcb == NULL || (tcb->flags & TCB_FLAG_JOIN_COMPLETED) != 0)
@ -136,7 +136,7 @@ int pthread_join(pthread_t thread, FAR pthread_addr_t *pexit_value)
sq_addfirst(&rtcb->join_entry, &tcb->join_queue); sq_addfirst(&rtcb->join_entry, &tcb->join_queue);
nxrmutex_unlock(&group->tg_joinlock); nxrmutex_unlock(&group->tg_mutex);
/* Take the thread's thread exit semaphore. We will sleep here /* Take the thread's thread exit semaphore. We will sleep here
* until the thread exits. We need to exercise caution because * until the thread exits. We need to exercise caution because
@ -146,7 +146,7 @@ int pthread_join(pthread_t thread, FAR pthread_addr_t *pexit_value)
nxsem_wait_uninterruptible(&rtcb->join_sem); nxsem_wait_uninterruptible(&rtcb->join_sem);
nxrmutex_lock(&group->tg_joinlock); nxrmutex_lock(&group->tg_mutex);
/* The thread has exited! Get the thread exit value */ /* The thread has exited! Get the thread exit value */
@ -156,7 +156,7 @@ int pthread_join(pthread_t thread, FAR pthread_addr_t *pexit_value)
} }
errout: errout:
nxrmutex_unlock(&group->tg_joinlock); nxrmutex_unlock(&group->tg_mutex);
leave_cancellation_point(); leave_cancellation_point();

View file

@ -75,8 +75,4 @@ void pthread_release(FAR struct task_group_s *group)
kmm_free(container_of(curr, struct task_join_s, entry)); kmm_free(container_of(curr, struct task_join_s, entry));
} }
/* Destroy the join list mutex */
nxrmutex_destroy(&group->tg_joinlock);
} }