score: Add _Objects_Get_by_name()

Replace _Objects_Name_to_id_string() with _Objects_Get_by_name() since
all users of this function are interested in the object itself and not
the identifier.

Use the object allocator lock to protect the search.

Update #2555.
This commit is contained in:
Sebastian Huber
2016-03-18 15:36:58 +01:00
parent 1f0e652a2a
commit c904df5733
16 changed files with 190 additions and 248 deletions
+12 -9
View File
@@ -246,17 +246,20 @@ _POSIX_Message_queue_Get_fd_interrupt_disable(
lock_context
);
}
/**
* @see _POSIX_Name_to_id().
*/
RTEMS_INLINE_ROUTINE int _POSIX_Message_queue_Name_to_id(
const char *name,
Objects_Id *id,
size_t *len
RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control *
_POSIX_Message_queue_Get_by_name(
const char *name,
size_t *name_length_p,
Objects_Get_by_name_error *error
)
{
return _POSIX_Name_to_id( &_POSIX_Message_queue_Information, name, id, len );
return (POSIX_Message_queue_Control *) _Objects_Get_by_name(
&_POSIX_Message_queue_Information,
name,
name_length_p,
error
);
}
#ifdef __cplusplus
+10 -21
View File
@@ -20,6 +20,7 @@
#define _RTEMS_POSIX_POSIXAPI_H
#include <rtems/config.h>
#include <rtems/score/assert.h>
#include <rtems/score/objectimpl.h>
/**
@@ -48,27 +49,15 @@ typedef enum {
*/
void _POSIX_Fatal_error( POSIX_Fatal_domain domain, int eno );
/**
* @brief Queries the object identifier @a id for a @a name.
*
* @param[in] information Object information.
* @param[in] name Zero terminated name string to look up.
* @param[out] id Pointer for identifier. The pointer must be valid.
* @param[out] len Pointer for string length. The pointer must be valid.
*
* @retval 0 Successful operation.
* @retval EINVAL The @a name pointer is @c NULL or the @a name string has
* zero length.
* @retval ENAMETOOLONG The @a name string length is greater than or equal to
* @c NAME_MAX.
* @retval ENOENT Found no corresponding identifier.
*/
int _POSIX_Name_to_id(
Objects_Information *information,
const char *name,
Objects_Id *id,
size_t *len
);
extern const int _POSIX_Get_by_name_error_table[ 3 ];
RTEMS_INLINE_ROUTINE int _POSIX_Get_by_name_error(
Objects_Get_by_name_error error
)
{
_Assert( (size_t) error < RTEMS_ARRAY_SIZE( _POSIX_Get_by_name_error_table ) );
return _POSIX_Get_by_name_error_table[ error ];
}
/** @} */
@@ -163,17 +163,19 @@ RTEMS_INLINE_ROUTINE void _POSIX_Semaphore_Namespace_remove (
_Objects_Namespace_remove(
&_POSIX_Semaphore_Information, &the_semaphore->Object );
}
/**
* @see _POSIX_Name_to_id().
*/
RTEMS_INLINE_ROUTINE int _POSIX_Semaphore_Name_to_id(
const char *name,
Objects_Id *id,
size_t *len
RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Get_by_name(
const char *name,
size_t *name_length_p,
Objects_Get_by_name_error *error
)
{
return _POSIX_Name_to_id( &_POSIX_Semaphore_Information, name, id, len );
return (POSIX_Semaphore_Control *) _Objects_Get_by_name(
&_POSIX_Semaphore_Information,
name,
name_length_p,
error
);
}
#ifdef __cplusplus
+9 -9
View File
@@ -67,11 +67,10 @@ mqd_t mq_open(
va_list arg;
struct mq_attr *attr = NULL;
int status;
Objects_Id the_mq_id;
POSIX_Message_queue_Control *the_mq;
POSIX_Message_queue_Control_fd *the_mq_fd;
Objects_Locations location;
size_t name_len;
Objects_Get_by_name_error error;
if ( oflag & O_CREAT ) {
va_start(arg, oflag);
@@ -87,7 +86,7 @@ mqd_t mq_open(
}
the_mq_fd->oflag = oflag;
status = _POSIX_Message_queue_Name_to_id( name, &the_mq_id, &name_len );
the_mq = _POSIX_Message_queue_Get_by_name( name, &name_len, &error );
/*
* If the name to id translation worked, then the message queue exists
@@ -95,15 +94,18 @@ mqd_t mq_open(
* need to check to see if this is a "message queue does not exist"
* or some other miscellaneous error on the name.
*/
if ( status ) {
if ( the_mq == NULL ) {
/*
* Unless provided a valid name that did not already exist
* and we are willing to create then it is an error.
*/
if ( !( status == ENOENT && (oflag & O_CREAT) ) ) {
if ( !( error == OBJECTS_GET_BY_NAME_NO_OBJECT && (oflag & O_CREAT) ) ) {
_POSIX_Message_queue_Free_fd( the_mq_fd );
_Objects_Allocator_unlock();
rtems_set_errno_and_return_value( status, MQ_OPEN_FAILED );
rtems_set_errno_and_return_value(
_POSIX_Get_by_name_error( error ),
MQ_OPEN_FAILED
);
}
} else { /* name -> ID translation succeeded */
@@ -120,7 +122,6 @@ mqd_t mq_open(
* In this case we need to do an ID->pointer conversion to
* check the mode.
*/
the_mq = _POSIX_Message_queue_Get( the_mq_id, &location );
the_mq->open_count += 1;
the_mq_fd->Queue = the_mq;
_Objects_Open_string(
@@ -128,7 +129,6 @@ mqd_t mq_open(
&the_mq_fd->Object,
NULL
);
_Thread_Enable_dispatch();
_Objects_Allocator_unlock();
return the_mq_fd->Object.id;
@@ -149,7 +149,7 @@ mqd_t mq_open(
/*
* errno was set by Create_support, so don't set it again.
*/
if ( status == -1 ) {
if ( status != 0 ) {
_POSIX_Message_queue_Free_fd( the_mq_fd );
_Objects_Allocator_unlock();
return MQ_OPEN_FAILED;
+8 -27
View File
@@ -18,19 +18,10 @@
#include "config.h"
#endif
#include <stdarg.h>
#include <pthread.h>
#include <limits.h>
#include <errno.h>
#include <fcntl.h>
#include <mqueue.h>
#include <rtems/system.h>
#include <rtems/score/watchdog.h>
#include <rtems/score/wkspace.h>
#include <rtems/seterr.h>
#include <rtems/posix/mqueueimpl.h>
#include <rtems/seterr.h>
/*
* 15.2.2 Remove a Message Queue, P1003.1b-1993, p. 276
@@ -40,31 +31,21 @@ int mq_unlink(
const char *name
)
{
int status;
POSIX_Message_queue_Control *the_mq;
Objects_Id the_mq_id;
size_t name_len;
POSIX_Message_queue_Control *the_mq;
Objects_Get_by_name_error error;
_Objects_Allocator_lock();
_Thread_Disable_dispatch();
status = _POSIX_Message_queue_Name_to_id( name, &the_mq_id, &name_len );
if ( status != 0 ) {
_Thread_Enable_dispatch();
the_mq = _POSIX_Message_queue_Get_by_name( name, NULL, &error );
if ( the_mq == NULL ) {
_Objects_Allocator_unlock();
rtems_set_errno_and_return_minus_one( status );
}
the_mq = (POSIX_Message_queue_Control *) _Objects_Get_local_object(
&_POSIX_Message_queue_Information,
_Objects_Get_index( the_mq_id )
);
rtems_set_errno_and_return_minus_one( _POSIX_Get_by_name_error( error ) );
}
the_mq->linked = false;
_POSIX_Message_queue_Namespace_remove( the_mq );
_POSIX_Message_queue_Delete( the_mq );
_Thread_Enable_dispatch();
_Objects_Allocator_unlock();
_Objects_Allocator_unlock();
return 0;
}
+5 -39
View File
@@ -20,44 +20,10 @@
#include <rtems/posix/posixapi.h>
#include <string.h>
#include <limits.h>
#include <errno.h>
/* pure ANSI mode does not have this prototype */
size_t strnlen(const char *, size_t);
int _POSIX_Name_to_id(
Objects_Information *information,
const char *name,
Objects_Id *id,
size_t *len
)
{
int eno = EINVAL;
size_t n = 0;
if ( name != NULL && name [0] != '\0' ) {
n = strnlen( name, NAME_MAX );
if ( n < NAME_MAX ) {
Objects_Name_or_id_lookup_errors status = _Objects_Name_to_id_string(
information,
name,
id
);
if ( status == OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL ) {
eno = 0;
} else {
eno = ENOENT;
}
} else {
eno = ENAMETOOLONG;
}
}
*len = n;
return eno;
}
const int _POSIX_Get_by_name_error_table[ 3 ] = {
EINVAL,
ENAMETOOLONG,
ENOENT
};
+9 -9
View File
@@ -60,10 +60,9 @@ sem_t *sem_open(
va_list arg;
unsigned int value = 0;
int status;
Objects_Id the_semaphore_id;
POSIX_Semaphore_Control *the_semaphore;
Objects_Locations location;
size_t name_len;
Objects_Get_by_name_error error;
if ( oflag & O_CREAT ) {
va_start(arg, oflag);
@@ -73,7 +72,7 @@ sem_t *sem_open(
}
_Objects_Allocator_lock();
status = _POSIX_Semaphore_Name_to_id( name, &the_semaphore_id, &name_len );
the_semaphore = _POSIX_Semaphore_Get_by_name( name, &name_len, &error );
/*
* If the name to id translation worked, then the semaphore exists
@@ -82,16 +81,19 @@ sem_t *sem_open(
* or some other miscellaneous error on the name.
*/
if ( status ) {
if ( the_semaphore == NULL ) {
/*
* Unless provided a valid name that did not already exist
* and we are willing to create then it is an error.
*/
if ( !( status == ENOENT && (oflag & O_CREAT) ) ) {
if ( !( error == OBJECTS_GET_BY_NAME_NO_OBJECT && (oflag & O_CREAT) ) ) {
_Objects_Allocator_unlock();
rtems_set_errno_and_return_value( status, SEM_FAILED );
rtems_set_errno_and_return_value(
_POSIX_Get_by_name_error( error ),
SEM_FAILED
);
}
} else {
@@ -104,9 +106,7 @@ sem_t *sem_open(
rtems_set_errno_and_return_value( EEXIST, SEM_FAILED );
}
the_semaphore = _POSIX_Semaphore_Get( (sem_t *) &the_semaphore_id, &location );
the_semaphore->open_count += 1;
_Thread_Enable_dispatch();
_Objects_Allocator_unlock();
goto return_id;
}
@@ -130,7 +130,7 @@ sem_t *sem_open(
_Objects_Allocator_unlock();
if ( status == -1 )
if ( status != 0 )
return SEM_FAILED;
return_id:
+5 -23
View File
@@ -18,15 +18,8 @@
#include "config.h"
#endif
#include <stdarg.h>
#include <errno.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <limits.h>
#include <rtems/system.h>
#include <rtems/posix/semaphoreimpl.h>
#include <rtems/seterr.h>
@@ -34,32 +27,21 @@ int sem_unlink(
const char *name
)
{
int status;
POSIX_Semaphore_Control *the_semaphore;
Objects_Id the_semaphore_id;
size_t name_len;
POSIX_Semaphore_Control *the_semaphore;
Objects_Get_by_name_error error;
_Objects_Allocator_lock();
_Thread_Disable_dispatch();
status = _POSIX_Semaphore_Name_to_id( name, &the_semaphore_id, &name_len );
if ( status != 0 ) {
_Thread_Enable_dispatch();
the_semaphore = _POSIX_Semaphore_Get_by_name( name, NULL, &error );
if ( the_semaphore == NULL ) {
_Objects_Allocator_unlock();
rtems_set_errno_and_return_minus_one( status );
rtems_set_errno_and_return_minus_one( _POSIX_Get_by_name_error( error ) );
}
the_semaphore = (POSIX_Semaphore_Control *) _Objects_Get_local_object(
&_POSIX_Semaphore_Information,
_Objects_Get_index( the_semaphore_id )
);
the_semaphore->linked = false;
_POSIX_Semaphore_Namespace_remove( the_semaphore );
_POSIX_Semaphore_Delete( the_semaphore );
_Thread_Enable_dispatch();
_Objects_Allocator_unlock();
return 0;
}
+25 -14
View File
@@ -448,25 +448,31 @@ Objects_Name_or_id_lookup_errors _Objects_Name_to_id_u32(
);
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
typedef enum {
OBJECTS_GET_BY_NAME_INVALID_NAME,
OBJECTS_GET_BY_NAME_NAME_TOO_LONG,
OBJECTS_GET_BY_NAME_NO_OBJECT
} Objects_Get_by_name_error;
/**
* @brief Converts an object name to an Id.
* @brief Gets an object control block identified by its name.
*
* This method converts an object name to an Id. It performs a look up
* using the object information block for this object class.
* The object information must use string names.
*
* @param[in] information points to an object class information block.
* @param[in] name is the name of the object to find.
* @param[in] id will contain the Id if the search is successful.
* @param information The object information. Must not be NULL.
* @param name The object name.
* @param name_length_p Optional parameter to return the name length.
* @param error The error indication in case of failure. Must not be NULL.
*
* @retval This method returns one of the values from the
* @ref Objects_Name_or_id_lookup_errors enumeration to indicate
* successful or failure. On success @a id will contain the Id of
* the requested object.
* @retval NULL No object exists for this name or invalid parameters.
* @retval other The first object according to object index associated with
* this name.
*/
Objects_Name_or_id_lookup_errors _Objects_Name_to_id_string(
Objects_Information *information,
const char *name,
Objects_Id *id
Objects_Control *_Objects_Get_by_name(
const Objects_Information *information,
const char *name,
size_t *name_length_p,
Objects_Get_by_name_error *error
);
#endif
@@ -1054,6 +1060,11 @@ RTEMS_INLINE_ROUTINE void _Objects_Allocator_unlock( void )
_RTEMS_Unlock_allocator();
}
RTEMS_INLINE_ROUTINE bool _Objects_Allocator_is_owner( void )
{
return _RTEMS_Allocator_is_owner();
}
/** @} */
#ifdef __cplusplus
+36 -23
View File
@@ -23,40 +23,53 @@
#include <string.h>
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
Objects_Name_or_id_lookup_errors _Objects_Name_to_id_string(
Objects_Information *information,
const char *name,
Objects_Id *id
Objects_Control *_Objects_Get_by_name(
const Objects_Information *information,
const char *name,
size_t *name_length_p,
Objects_Get_by_name_error *error
)
{
Objects_Control *the_object;
uint32_t index;
size_t name_length;
size_t max_name_length;
uint32_t index;
/* ASSERT: information->is_string == true */
_Assert( information->is_string );
_Assert( _Objects_Allocator_is_owner() );
if ( !id )
return OBJECTS_INVALID_ADDRESS;
if ( name == NULL ) {
*error = OBJECTS_GET_BY_NAME_INVALID_NAME;
return NULL;
}
if ( !name )
return OBJECTS_INVALID_NAME;
name_length = strnlen( name, information->name_length + 1 );
max_name_length = information->name_length;
if ( name_length > max_name_length ) {
*error = OBJECTS_GET_BY_NAME_NAME_TOO_LONG;
return NULL;
}
if ( information->maximum != 0 ) {
if ( name_length_p != NULL ) {
*name_length_p = name_length;
}
for ( index = 1; index <= information->maximum; index++ ) {
the_object = information->local_table[ index ];
if ( !the_object )
continue;
for ( index = 1; index <= information->maximum; index++ ) {
Objects_Control *the_object;
if ( !the_object->name.name_p )
continue;
the_object = information->local_table[ index ];
if (!strncmp( name, the_object->name.name_p, information->name_length)) {
*id = the_object->id;
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
}
if ( the_object == NULL )
continue;
if ( the_object->name.name_p == NULL )
continue;
if ( strncmp( name, the_object->name.name_p, max_name_length ) == 0 ) {
return the_object;
}
}
return OBJECTS_INVALID_NAME;
*error = OBJECTS_GET_BY_NAME_NO_OBJECT;
return NULL;
}
#endif
+3 -3
View File
@@ -378,13 +378,13 @@ void validate_mq_unlink_error_codes(void)
fatal_posix_service_status( errno, EINVAL, "mq_unlink errno value");
/*
* EINVAL - Unlink a queue with a null name
* ENOENT - Unlink a queue with a zero length name
*/
puts( "Init: mq_unlink (\"\") - EINVAL" );
puts( "Init: mq_unlink (\"\") - ENOENT" );
status = mq_unlink( "" );
fatal_posix_service_status( status, -1, "mq_unlink error return status");
fatal_posix_service_status( errno, EINVAL, "mq_unlink errno value");
fatal_posix_service_status( errno, ENOENT, "mq_unlink errno value");
}
void validate_mq_close_error_codes(void)
+22 -23
View File
@@ -1,11 +1,11 @@
*** POSIX MESSAGE QUEUE TEST ***
*** BEGIN OF TEST PSXMSGQ 1 ***
_______________mq_open errors
Init: mq_open - Create with maxmsg (-1) (EINVAL)
Init: mq_open - Create with msgsize (-1) (EINVAL)
Init: mq_open - Open new mq without create flag (ENOENT)
Init: mq_open - Open with too long of a name (ENAMETOOLONG)
Init: mq_open - Create an Existing mq (EEXIST)
Init: mq_open - SUCCESSFUL
Init: mq_open - SUCCESSFUL
Init: mq_open - system is out of resources (ENFILE)
Init: mq_close and mq_unlink (mq3...mqn) - SUCCESSFUL
Init: Open Test Queues
@@ -13,7 +13,7 @@ _______________mq_unlink errors
Init: mq_unlink - mq_unlink with too long of a name (ENAMETOOLONG)
Init: mq_unlink - A Queue not opened (ENOENT)
Init: mq_unlink (NULL) - EINVAL
Init: mq_unlink ("") - EINVAL
Init: mq_unlink ("") - ENOENT
_______________mq_close errors
Init: mq_close - unopened queue (EBADF)
_______________mq_unlink functionality
@@ -21,9 +21,9 @@ Init: Unlink and Open without closing SUCCESSFUL
Task1:mq_setattr - unopened queue (EBADF)
Task1:mq_setattr - NULL attributes (EINVAL)
Init: set_attr all queues to blocking
Init: Init: mq_timedreceive - on queue Qnoblock Init: 1 sec -12131 us
Init: Init: mq_timedreceive - on queue Qblock Init: 1 sec -11843 us
Init: Init: mq_timedreceive - on queue Qdefault Init: 0 sec 988133 us
Init: Init: mq_timedreceive - on queue Qnoblock Init: 1 sec -8622 us
Init: Init: mq_timedreceive - on queue Qblock Init: 1 sec -1872 us
Init: Init: mq_timedreceive - on queue Qdefault Init: 1 sec -1881 us
_______________mq_send errors
Init: mq_send - Closed message queue (EBADF)
Init: mq_send - Read only message queue (EBADF)
@@ -37,9 +37,9 @@ _______________mq_getattr errors
Init: mq_getattr - unopened queue (EBADF)
Init: mq_getattr - NULL attributes (EINVAL)
_______________mq_timedsend
Init: mq_timedsend - on queue Qnoblock Init: 0 sec 77 us
Init: mq_timedsend - on queue Qblock Init: 0 sec 988482 us
Init: mq_timedsend - on queue Qdefault Init: 0 sec 101 us
Init: mq_timedsend - on queue Qnoblock Init: 0 sec 127 us
Init: mq_timedsend - on queue Qblock Init: 1 sec -9245 us
Init: mq_timedsend - on queue Qdefault Init: 0 sec 130 us
_______________mq_receive errors
Init: mq_receive - Unopened message queue (EBADF)
Init: mq_receive - Write only queue (EBADF)
@@ -48,9 +48,9 @@ Init: Verify Queues are full
Init: Empty all Queues
Init: mq_receive - Queue is empty (EAGAIN)
_______________mq_timedreceive
Init: Init: mq_timedreceive - on queue Qnoblock Init: 0 sec 83 us
Init: Init: mq_timedreceive - on queue Qblock Init: 0 sec 986568 us
Init: Init: mq_timedreceive - on queue Qdefault Init: 1 sec -11823 us
Init: Init: mq_timedreceive - on queue Qnoblock Init: 0 sec 128 us
Init: Init: mq_timedreceive - on queue Qblock Init: 1 sec -715 us
Init: Init: mq_timedreceive - on queue Qdefault Init: 1 sec -1836 us
_______________mq_open functionality
_______________mq_notify
Init: mq_notify - Unopened message queue (EBADF)
@@ -70,19 +70,19 @@ Init: Verify No Signal when send
Init: mq_send - to Qnoblock msg: 12345678 priority 31
waiting on any signal for 3 seconds.
_______________multi-thread Task 1 Test
Task_1: Fri Jan 1 00:00:17 1988
Task_1: Fri Jan 1 00:00:18 1988
Task_1: mq_send - to Qblock msg: 12345678 priority 31
Task_1: pthread_exit
Init: Fri Jan 1 00:00:17 1988
Init: Fri Jan 1 00:00:18 1988
_______________multi-thread Task 2 Test
Init: Verify Queues are empty
Init: Fill Queues with messages
Init: Verify Queues are full
Init: mq_send - to Qblock msg: Last priority 32
Task_2: Fri Jan 1 00:00:17 1988
Task_2: Fri Jan 1 00:00:18 1988
Task_2: Verify Queues are full
Task_2: pthread_exit
Init: Fri Jan 1 00:00:17 1988
Init: Fri Jan 1 00:00:18 1988
Init: Verify Queues are full
Init: Empty all Queues
_______________multi-thread Task 3 Test
@@ -90,14 +90,13 @@ Init: Verify Queues are empty
Init: Fill Queues with messages
Init: Verify Queues are full
Init: mq_send - Block while thread deletes queue (EBADF)
Task_3: Fri Jan 1 00:00:18 1988
Task_3: Fri Jan 1 00:00:18 1988
_______________Unlink and Close All Files
Task_3: pthread_exit
_______________mq_timedout_receive
Init: Init: verify_timedout_mq_timedreceive - on queue Qnoblock Init: 0 sec 54 us
Init: Init: verify_timedout_mq_timedreceive - on queue Qnoblock Init: 0 sec 81 us
_______________verify_timedout_mq_timedsend
Init: verify_timedout_mq_timedsend - on queue Qnoblock Init: 0 sec 54 us
Init: verify_timedout_mq_timedsend - on queue Qblock Init: 0 sec 55 us
Init: verify_timedout_mq_timedsend - on queue Qdefault Init: 0 sec 78 us
*** END OF POSIX MESSAGE QUEUE TEST ***
Init: verify_timedout_mq_timedsend - on queue Qnoblock Init: 0 sec 84 us
Init: verify_timedout_mq_timedsend - on queue Qblock Init: 0 sec 86 us
Init: verify_timedout_mq_timedsend - on queue Qdefault Init: 0 sec 104 us
*** END OF TEST PSXMSGQ 1 ***
+21 -23
View File
@@ -29,11 +29,12 @@ 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;
Objects_Get_by_name_error error;
Objects_Information TestClass;
Objects_Control *the_object;
char name[64];
size_t name_len;
bool bc;
TEST_BEGIN();
@@ -53,27 +54,24 @@ rtems_task Init(
#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_Get_by_name - NULL name" );
the_object = _Objects_Get_by_name( &TestClass, NULL, NULL, &error );
rtems_test_assert( the_object == NULL );
rtems_test_assert( error == OBJECTS_GET_BY_NAME_INVALID_NAME );
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_Get_by_name - name too long" );
strcpy( name, "TOOOOOOOOOOOOOOOOOO LONG" );
the_object = _Objects_Get_by_name( &TestClass, name, NULL, &error );
rtems_test_assert( the_object == NULL );
rtems_test_assert( error == OBJECTS_GET_BY_NAME_NAME_TOO_LONG );
puts( "INIT - _Objects_Name_to_id_string - name of non-existent object" );
puts( "INIT - _Objects_Get_by_name - 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);
}
name_len = 123;
the_object = _Objects_Get_by_name( &TestClass, name, &name_len, &error );
rtems_test_assert( the_object == NULL );
rtems_test_assert( error == OBJECTS_GET_BY_NAME_NO_OBJECT );
rtems_test_assert( name_len == 9 );
/* out of memory error ONLY when POSIX is enabled */
puts( "INIT - _Objects_Set_name fails - out of memory" );
+5 -6
View File
@@ -1,7 +1,6 @@
*** POSIX OBJECT TEST 1 ***
INIT - _Objects_Name_to_id_string - NULL name
INIT - _Objects_Name_to_id_string - NULL ID
INIT - _Objects_Name_to_id_string - name of non-existent object
*** BEGIN OF TEST PSXOBJ 1 ***
INIT - _Objects_Get_by_name - NULL name
INIT - _Objects_Get_by_name - name too long
INIT - _Objects_Get_by_name - name of non-existent object
INIT - _Objects_Set_name fails - out of memory
Allocate_majority_of_workspace:
*** END OF POSIX OBJECT TEST 1 ***
*** END OF TEST PSXOBJ 1 ***
+2 -2
View File
@@ -279,10 +279,10 @@ void *POSIX_Init(
fatal_posix_service_status( status, -1, "sem_unlink error return status");
fatal_posix_service_status( errno, EINVAL, "sem_unlink errno value");
puts( "Init: sem_unlink (\"\") - EINVAL" );
puts( "Init: sem_unlink (\"\") - ENOENT" );
status = sem_unlink( "" );
fatal_posix_service_status( status, -1, "sem_unlink error return status");
fatal_posix_service_status( errno, EINVAL, "sem_unlink errno value");
fatal_posix_service_status( errno, ENOENT, "sem_unlink errno value");
/*
* XXX - Cant' create location OBJECTS_ERROR or OBJECTS_REMOTE.
+7 -8
View File
@@ -1,10 +1,10 @@
*** POSIX SEMAPHORE MANAGER TEST 1 ***
*** BEGIN OF TEST PSXSEM 1 ***
Init: sem_init - UNSUCCESSFUL (EINVAL)
Init: sem_init - SUCCESSFUL
Init: sem_init - UNSUCCESSFUL (ENOSPC)
Init: sem_init - UNSUCCESSFUL (ENOSYS -- pshared not supported)
Init: sem_getvalue - SUCCESSFUL
Init: sem_getvalue - UNSUCCESSFUL
Init: sem_getvalue - SUCCESSFUL
Init: sem_getvalue - UNSUCCESSFUL
Init: sem_destroy - SUCCESSFUL
Init: sem_destroy - UNSUCCESSFUL (EINVAL)
Init: sem_wait - SUCCESSFUL
@@ -13,10 +13,10 @@ Init: sem_post - SUCCESSFUL
Init: sem_wait - SUCCESSFUL (after a sem_post)
Init: sem_trywait - SUCCESSFUL
Init: sem_trywait - UNSUCCESSFUL (EAGAIN)
Init: sem_trywait - UNSUCCESSFUL (EINVAL) -- skipping
Init: sem_trywait - UNSUCCESSFUL (EINVAL)
Init: sem_timedwait - SUCCESSFUL
Init: sem_timedwait - UNSUCCESSFUL (ETIMEDOUT)
Init: sem_timedwait - UNSUCCESSFUL (EINVAL)
Init: sem_timedwait - UNSUCCESSFUL (EINVAL) -- skipping
Init: sem_post - UNSUCCESSFUL (EINVAL)
Init: sem_destroy - SUCCESSFUL
Init: sem_open - UNSUCCESSFUL (ENAMETOOLONG)
@@ -34,7 +34,6 @@ Init: sem_unlink - sem1 (2) SUCCESSFUL
Init: sem_close - UNSUCCESSFUL (EINVAL)
Init: sem_unlink - UNSUCCESSFUL (ENOENT)
Init: sem_unlink (NULL) - EINVAL
Init: sem_unlink ("") - EINVAL
Init: sem_unlink ("") - ENOENT
Init: sem_unlink - UNSUCCESSFUL (ENOENT)
*** END OF POSIX SEMAPHORE MANAGER TEST 1 ***
*** END OF TEST PSXSEM 1 ***