/* * This method will set the object name based upon the user string. * If the object class uses 32-bit names, then only the first 4 bytes * of the string will be used. */ rtems_status_code rtems_object_set_name( rtems_id id, const char *name ) { Objects_Information *information; Objects_Control *the_object; Objects_Id tmpId; if ( !name ) return RTEMS_INVALID_ADDRESS; tmpId = (id == OBJECTS_ID_OF_SELF) ? rtems_task_self() : id; information = _Objects_Get_information_id( tmpId ); if ( !information ) return RTEMS_INVALID_ID; _Objects_Allocator_lock(); the_object = _Objects_Get_no_protection( tmpId, information ); if ( the_object == NULL ) { _Objects_Allocator_unlock(); return RTEMS_INVALID_ID; } _Objects_Set_name( information, the_object, name ); _Objects_Allocator_unlock(); return RTEMS_SUCCESSFUL; }
rtems_task Init( rtems_task_argument ignored ) { Objects_Name_or_id_lookup_errors namerc; Objects_Information TestClass; Objects_Id id; char name[64]; bool bc; puts( "\n\n*** POSIX OBJECT TEST 1 ***" ); /* very fake object class to test with */ _Objects_Initialize_information( &TestClass, 1, /* the_api */ 4, /* the_class */ 0, /* maximum */ 4, /* size */ true, /* is_string */ 10 /* maximum_name_length */ #if defined(RTEMS_MULTIPROCESSING) , false, /* supports_global */ NULL /* Objects_Thread_queue_Extract_callout extract */ #endif ); puts( "INIT - _Objects_Name_to_id_string - NULL name" ); namerc = _Objects_Name_to_id_string( &TestClass, NULL, &id ); if ( namerc != OBJECTS_INVALID_NAME ) { printf( "ERROR - Status = %d\n", namerc ); rtems_test_exit(0); } puts( "INIT - _Objects_Name_to_id_string - NULL ID" ); namerc = _Objects_Name_to_id_string( &TestClass, name, NULL ); if ( namerc != OBJECTS_INVALID_ADDRESS ) { printf( "ERROR - Status = %d\n", namerc ); rtems_test_exit(0); } puts( "INIT - _Objects_Name_to_id_string - name of non-existent object" ); strcpy( name, "NOT FOUND" ); namerc = _Objects_Name_to_id_string( &TestClass, name, &id ); if ( namerc != OBJECTS_INVALID_NAME ) { printf( "ERROR - Status = %d\n", namerc ); rtems_test_exit(0); } /* out of memory error ONLY when POSIX is enabled */ puts( "INIT - _Objects_Set_name fails - out of memory" ); rtems_workspace_greedy_allocate( NULL, 0 ); bc = _Objects_Set_name( &TestClass, &_Thread_Get_executing()->Object, name ); rtems_test_assert( bc == false ); puts( "*** END OF POSIX OBJECT TEST 1 ***" ); rtems_test_exit(0); }
/* * This method will set the object name based upon the user string. * If the object class uses 32-bit names, then only the first 4 bytes * of the string will be used. */ rtems_status_code rtems_object_set_name( rtems_id id, const char *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; information = _Objects_Get_information_id( tmpId ); if ( !information ) return RTEMS_INVALID_ID; the_object = _Objects_Get( information, tmpId, &location ); switch ( location ) { 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; } return RTEMS_INVALID_ID; }