diff options
Diffstat (limited to 'cpukit/include/rtems/posix/posixapi.h')
-rw-r--r-- | cpukit/include/rtems/posix/posixapi.h | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/cpukit/include/rtems/posix/posixapi.h b/cpukit/include/rtems/posix/posixapi.h new file mode 100644 index 0000000000..29394ab94e --- /dev/null +++ b/cpukit/include/rtems/posix/posixapi.h @@ -0,0 +1,146 @@ +/** + * @file + * + * @brief POSIX API Implementation + * + * This include file defines the top level interface to the POSIX API + * implementation in RTEMS. + */ + +/* + * COPYRIGHT (c) 1989-2011. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + */ + +#ifndef _RTEMS_POSIX_POSIXAPI_H +#define _RTEMS_POSIX_POSIXAPI_H + +#include <rtems/config.h> +#include <rtems/score/assert.h> +#include <rtems/score/objectimpl.h> +#include <rtems/score/onceimpl.h> +#include <rtems/score/threadimpl.h> +#include <rtems/seterr.h> + +#include <pthread.h> + +/** + * @defgroup POSIXAPI RTEMS POSIX API + * + * RTEMS POSIX API definitions and modules. + * + */ +/**@{**/ + +/** + * @brief POSIX API Fatal domains. + */ +typedef enum { + POSIX_FD_PTHREAD, /**< A pthread thread error. */ + POSIX_FD_PTHREAD_ONCE /**< A pthread once error. */ +} POSIX_Fatal_domain; + +/** + * @brief POSIX API Fatal error. + * + * A common method of rasing a POSIX API fatal error. + * + * @param[in] domain The POSIX error domain. + * @param[in] eno The error number as defined in errno.h. + */ +void _POSIX_Fatal_error( POSIX_Fatal_domain domain, int eno ); + +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 ]; +} + +RTEMS_INLINE_ROUTINE int _POSIX_Get_error( Status_Control status ) +{ + return STATUS_GET_POSIX( status ); +} + +RTEMS_INLINE_ROUTINE int _POSIX_Get_error_after_wait( + const Thread_Control *executing +) +{ + return _POSIX_Get_error( _Thread_Wait_get_status( executing ) ); +} + +RTEMS_INLINE_ROUTINE int _POSIX_Zero_or_minus_one_plus_errno( + Status_Control status +) +{ + if ( status == STATUS_SUCCESSFUL ) { + return 0; + } + + rtems_set_errno_and_return_minus_one( _POSIX_Get_error( status ) ); +} + +/** + * @brief Macro to generate a function body to get a POSIX object by + * identifier. + * + * Generates a function body to get the object for the specified identifier. + * Performs automatic initialization if requested and necessary. This is an + * ugly macro, since C lacks support for templates. + */ +#define _POSIX_Get_object_body( \ + type, \ + id, \ + queue_context, \ + info, \ + initializer, \ + init \ +) \ + Objects_Control *the_object; \ + if ( id == NULL ) { \ + return NULL; \ + } \ + _Thread_queue_Context_initialize( queue_context ); \ + the_object = _Objects_Get( \ + (Objects_Id) *id, \ + &queue_context->Lock_context.Lock_context, \ + info \ + ); \ + if ( the_object == NULL ) { \ + _Once_Lock(); \ + if ( *id == initializer ) { \ + init( id, NULL ); \ + } \ + _Once_Unlock(); \ + the_object = _Objects_Get( \ + (Objects_Id) *id, \ + &queue_context->Lock_context.Lock_context, \ + info \ + ); \ + } \ + return (type *) the_object + +/* + * See also The Open Group Base Specifications Issue 7, IEEE Std 1003.1-2008, + * 2016 Edition, subsection 2.9.9, Synchronization Object Copies and + * Alternative Mappings. + * + * http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_09_09 + */ +RTEMS_INLINE_ROUTINE bool _POSIX_Is_valid_pshared( int pshared ) +{ + return pshared == PTHREAD_PROCESS_PRIVATE || + pshared == PTHREAD_PROCESS_SHARED; +} + +/** @} */ + +#endif +/* end of include file */ |