mirror of
https://github.com/apache/nuttx.git
synced 2026-05-27 11:26:12 +08:00
pthreads: Backed most of last pthread changes. Found the 'real' root poblem. A one like error in pthread_mutex.c.
This commit is contained in:
@@ -55,18 +55,7 @@ static void rdlock_cleanup(FAR void *arg)
|
|||||||
{
|
{
|
||||||
FAR pthread_rwlock_t *rw_lock = (FAR pthread_rwlock_t *)arg;
|
FAR pthread_rwlock_t *rw_lock = (FAR pthread_rwlock_t *)arg;
|
||||||
|
|
||||||
#ifndef CONFIG_PTHREAD_MUTEX_UNSAFE
|
(void)pthread_mutex_unlock(&rw_lock->lock);
|
||||||
/* Check if this is a robust mutex in an inconsistent state */
|
|
||||||
|
|
||||||
if ((rw_lock->lock.flags & _PTHREAD_MFLAGS_INCONSISTENT) != 0)
|
|
||||||
{
|
|
||||||
(void)pthread_mutex_consistent(&rw_lock->lock);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
(void)pthread_mutex_unlock(&rw_lock->lock);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -56,19 +56,7 @@ static void wrlock_cleanup(FAR void *arg)
|
|||||||
FAR pthread_rwlock_t *rw_lock = (FAR pthread_rwlock_t *)arg;
|
FAR pthread_rwlock_t *rw_lock = (FAR pthread_rwlock_t *)arg;
|
||||||
|
|
||||||
rw_lock->num_writers--;
|
rw_lock->num_writers--;
|
||||||
|
(void)pthread_mutex_unlock(&rw_lock->lock);
|
||||||
#ifndef CONFIG_PTHREAD_MUTEX_UNSAFE
|
|
||||||
/* Check if this is a robust mutex in an inconsistent state */
|
|
||||||
|
|
||||||
if ((rw_lock->lock.flags & _PTHREAD_MFLAGS_INCONSISTENT) != 0)
|
|
||||||
{
|
|
||||||
(void)pthread_mutex_consistent(&rw_lock->lock);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
(void)pthread_mutex_unlock(&rw_lock->lock);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -145,12 +145,6 @@ int pthread_cancel(pthread_t thread)
|
|||||||
pthread_exit(PTHREAD_CANCELED);
|
pthread_exit(PTHREAD_CANCELED);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_PTHREAD_MUTEX_UNSAFE
|
|
||||||
/* Recover any mutexes still held by the canceled thread */
|
|
||||||
|
|
||||||
pthread_mutex_inconsistent(tcb);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_PTHREAD_CLEANUP
|
#ifdef CONFIG_PTHREAD_CLEANUP
|
||||||
/* Perform any stack pthread clean-up callbacks.
|
/* Perform any stack pthread clean-up callbacks.
|
||||||
*
|
*
|
||||||
@@ -168,6 +162,12 @@ int pthread_cancel(pthread_t thread)
|
|||||||
|
|
||||||
(void)pthread_completejoin((pid_t)thread, PTHREAD_CANCELED);
|
(void)pthread_completejoin((pid_t)thread, PTHREAD_CANCELED);
|
||||||
|
|
||||||
|
#ifndef CONFIG_PTHREAD_MUTEX_UNSAFE
|
||||||
|
/* Recover any mutexes still held by the canceled thread */
|
||||||
|
|
||||||
|
pthread_mutex_inconsistent(tcb);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Then let task_terminate do the real work */
|
/* Then let task_terminate do the real work */
|
||||||
|
|
||||||
return task_terminate((pid_t)thread, false);
|
return task_terminate((pid_t)thread, false);
|
||||||
|
|||||||
@@ -105,12 +105,6 @@ void pthread_exit(FAR void *exit_value)
|
|||||||
tcb->cpcount = 0;
|
tcb->cpcount = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef CONFIG_PTHREAD_MUTEX_UNSAFE
|
|
||||||
/* Recover any mutexes still held by the canceled thread */
|
|
||||||
|
|
||||||
pthread_mutex_inconsistent((FAR struct pthread_tcb_s *)tcb);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_PTHREAD_CLEANUP
|
#ifdef CONFIG_PTHREAD_CLEANUP
|
||||||
/* Perform any stack pthread clean-up callbacks */
|
/* Perform any stack pthread clean-up callbacks */
|
||||||
|
|
||||||
@@ -129,6 +123,12 @@ void pthread_exit(FAR void *exit_value)
|
|||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef CONFIG_PTHREAD_MUTEX_UNSAFE
|
||||||
|
/* Recover any mutexes still held by the canceled thread */
|
||||||
|
|
||||||
|
pthread_mutex_inconsistent((FAR struct pthread_tcb_s *)tcb);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Perform common task termination logic. This will get called again later
|
/* Perform common task termination logic. This will get called again later
|
||||||
* through logic kicked off by _exit(). However, we need to call it before
|
* through logic kicked off by _exit(). However, we need to call it before
|
||||||
* calling _exit() in order certain operations if this is the last thread
|
* calling _exit() in order certain operations if this is the last thread
|
||||||
|
|||||||
@@ -125,10 +125,12 @@ int pthread_mutex_take(FAR struct pthread_mutex_s *mutex, bool intr)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Take semaphore underlying the mutex */
|
/* Take semaphore underlying the mutex. pthread_takesemaphore
|
||||||
|
* returns zero on success and a positive errno value on failue.
|
||||||
|
*/
|
||||||
|
|
||||||
ret = pthread_takesemaphore(&mutex->sem, intr);
|
ret = pthread_takesemaphore(&mutex->sem, intr);
|
||||||
if (ret < OK)
|
if (ret != OK)
|
||||||
{
|
{
|
||||||
ret = get_errno();
|
ret = get_errno();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user