summaryrefslogtreecommitdiffstats
path: root/cpukit/posix/src/pthreadequal.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2013-06-05 11:48:57 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-06-07 17:06:43 +0200
commit2d2352bab92c51c2fd857b9555242545bd08c95e (patch)
treede11a05e5b361a161e93c98866aa704ed24ed3ae /cpukit/posix/src/pthreadequal.c
parentscore: Add _Objects_Put_for_get_isr_disable() (diff)
downloadrtems-2d2352bab92c51c2fd857b9555242545bd08c95e.tar.bz2
score: Add and use _Objects_Put()
Add and use _Objects_Put_without_thread_dispatch(). These two functions pair with the _Objects_Get() function. This helps to introduce object specific SMP locks to avoid lock contention.
Diffstat (limited to 'cpukit/posix/src/pthreadequal.c')
-rw-r--r--cpukit/posix/src/pthreadequal.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/cpukit/posix/src/pthreadequal.c b/cpukit/posix/src/pthreadequal.c
index 199cc8fb9a..9b2b0282ed 100644
--- a/cpukit/posix/src/pthreadequal.c
+++ b/cpukit/posix/src/pthreadequal.c
@@ -41,8 +41,10 @@ int pthread_equal(
#ifndef RTEMS_DEBUG
return _Objects_Are_ids_equal( t1, t2 );
#else
- int status;
- Objects_Locations location;
+ int status;
+ Objects_Locations location;
+ Thread_Control *thread_1;
+ Thread_Control *thread_2;
/*
* By default this is not a match.
@@ -54,7 +56,7 @@ int pthread_equal(
* Validate the first id and return 0 if it is not valid
*/
- (void) _Thread_Get( t1, &location );
+ thread_1 = _Thread_Get( t1, &location );
switch ( location ) {
case OBJECTS_LOCAL:
@@ -63,21 +65,21 @@ int pthread_equal(
* Validate the second id and return 0 if it is not valid
*/
- (void) _Thread_Get( t2, &location );
+ thread_2 = _Thread_Get( t2, &location );
switch ( location ) {
case OBJECTS_LOCAL:
status = _Objects_Are_ids_equal( t1, t2 );
- _Thread_Unnest_dispatch();
- _Thread_Enable_dispatch();
- break;
+ _Objects_Put_without_thread_dispatch( &thread_2->Object );
+ _Objects_Put( &thread_1->Object );
+ break;
case OBJECTS_ERROR:
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE:
#endif
/* t1 must have been valid so exit the critical section */
- _Thread_Enable_dispatch();
+ _Objects_Put( &thread_1->Object );
/* return status == 0 */
break;
}