rtems: Avoid Giant lock in rtems_object_set_name()

Update #2555.
This commit is contained in:
Sebastian Huber
2016-04-27 16:46:57 +02:00
parent f009ed086d
commit f4d541ccfe

View File

@@ -19,8 +19,8 @@
#endif
#include <rtems/rtems/object.h>
#include <rtems/rtems/tasks.h>
#include <rtems/score/objectimpl.h>
#include <rtems/score/thread.h>
/*
* This method will set the object name based upon the user string.
@@ -33,33 +33,27 @@ rtems_status_code rtems_object_set_name(
)
{
Objects_Information *information;
Objects_Locations location;
Objects_Control *the_object;
Objects_Id tmpId;
if ( !name )
return RTEMS_INVALID_ADDRESS;
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Get_executing()->Object.id : id;
tmpId = (id == OBJECTS_ID_OF_SELF) ? rtems_task_self() : id;
information = _Objects_Get_information_id( tmpId );
if ( !information )
return RTEMS_INVALID_ID;
the_object = _Objects_Get( information, tmpId, &location );
switch ( location ) {
_Objects_Allocator_lock();
the_object = _Objects_Get_no_protection( tmpId, information );
case OBJECTS_LOCAL:
_Objects_Set_name( information, the_object, name );
_Objects_Put( the_object );
return RTEMS_SUCCESSFUL;
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE:
#endif
case OBJECTS_ERROR:
break;
if ( the_object == NULL ) {
_Objects_Allocator_unlock();
return RTEMS_INVALID_ID;
}
return RTEMS_INVALID_ID;
_Objects_Set_name( information, the_object, name );
_Objects_Allocator_unlock();
return RTEMS_SUCCESSFUL;
}