source: rtems/cpukit/posix/include/rtems/posix/posixapi.h @ 6c2b8a4b

5
Last change on this file since 6c2b8a4b was 6c2b8a4b, checked in by Sebastian Huber <sebastian.huber@…>, on 11/29/17 at 05:23:27

score: Use self-contained API mutex

Use a self-contained recursive mutex for API_Mutex_Control. The API
mutexes are protected against asynchronous thread cancellation.

Add dedicated mutexes for libatomic and TOD.

Close #2629.
Close #2630.

  • Property mode set to 100644
File size: 3.4 KB
Line 
1/**
2 * @file
3 *
4 * @brief POSIX API Implementation
5 *
6 * This include file defines the top level interface to the POSIX API
7 * implementation in RTEMS.
8 */
9
10/*
11 *  COPYRIGHT (c) 1989-2011.
12 *  On-Line Applications Research Corporation (OAR).
13 *
14 *  The license and distribution terms for this file may be
15 *  found in the file LICENSE in this distribution or at
16 *  http://www.rtems.org/license/LICENSE.
17 */
18
19#ifndef _RTEMS_POSIX_POSIXAPI_H
20#define _RTEMS_POSIX_POSIXAPI_H
21
22#include <rtems/config.h>
23#include <rtems/score/assert.h>
24#include <rtems/score/objectimpl.h>
25#include <rtems/score/onceimpl.h>
26#include <rtems/score/threadimpl.h>
27#include <rtems/seterr.h>
28
29#include <pthread.h>
30
31/**
32 * @defgroup POSIXAPI RTEMS POSIX API
33 *
34 * RTEMS POSIX API definitions and modules.
35 *
36 */
37/**@{**/
38
39/**
40 * @brief POSIX API Fatal domains.
41 */
42typedef enum {
43  POSIX_FD_PTHREAD,      /**< A pthread thread error. */
44  POSIX_FD_PTHREAD_ONCE  /**< A pthread once error. */
45} POSIX_Fatal_domain;
46
47/**
48 * @brief POSIX API Fatal error.
49 *
50 * A common method of rasing a POSIX API fatal error.
51 *
52 * @param[in] domain The POSIX error domain.
53 * @param[in] eno The error number as defined in errno.h.
54 */
55void _POSIX_Fatal_error( POSIX_Fatal_domain domain, int eno );
56
57extern const int _POSIX_Get_by_name_error_table[ 3 ];
58
59RTEMS_INLINE_ROUTINE int _POSIX_Get_by_name_error(
60  Objects_Get_by_name_error error
61)
62{
63  _Assert( (size_t) error < RTEMS_ARRAY_SIZE( _POSIX_Get_by_name_error_table ) );
64  return _POSIX_Get_by_name_error_table[ error ];
65}
66
67RTEMS_INLINE_ROUTINE int _POSIX_Get_error( Status_Control status )
68{
69  return STATUS_GET_POSIX( status );
70}
71
72RTEMS_INLINE_ROUTINE int _POSIX_Get_error_after_wait(
73  const Thread_Control *executing
74)
75{
76  return _POSIX_Get_error( _Thread_Wait_get_status( executing ) );
77}
78
79RTEMS_INLINE_ROUTINE int _POSIX_Zero_or_minus_one_plus_errno(
80  Status_Control status
81)
82{
83  if ( status == STATUS_SUCCESSFUL ) {
84    return 0;
85  }
86
87  rtems_set_errno_and_return_minus_one( _POSIX_Get_error( status ) );
88}
89
90/**
91 * @brief Macro to generate a function body to get a POSIX object by
92 * identifier.
93 *
94 * Generates a function body to get the object for the specified identifier.
95 * Performs automatic initialization if requested and necessary.  This is an
96 * ugly macro, since C lacks support for templates.
97 */
98#define _POSIX_Get_object_body( \
99  type, \
100  id, \
101  queue_context, \
102  info, \
103  initializer, \
104  init \
105) \
106  Objects_Control *the_object; \
107  if ( id == NULL ) { \
108    return NULL; \
109  } \
110  _Thread_queue_Context_initialize( queue_context ); \
111  the_object = _Objects_Get( \
112    (Objects_Id) *id, \
113    &queue_context->Lock_context.Lock_context, \
114    info \
115  ); \
116  if ( the_object == NULL ) { \
117    _Once_Lock(); \
118    if ( *id == initializer ) { \
119      init( id, NULL ); \
120    } \
121    _Once_Unlock(); \
122    the_object = _Objects_Get( \
123      (Objects_Id) *id, \
124      &queue_context->Lock_context.Lock_context, \
125      info \
126    ); \
127  } \
128  return (type *) the_object
129
130/*
131 * See also The Open Group Base Specifications Issue 7, IEEE Std 1003.1-2008,
132 * 2016 Edition, subsection 2.9.9, Synchronization Object Copies and
133 * Alternative Mappings.
134 *
135 * http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_09_09
136 */
137RTEMS_INLINE_ROUTINE bool _POSIX_Is_valid_pshared( int pshared )
138{
139  return pshared == PTHREAD_PROCESS_PRIVATE ||
140    pshared == PTHREAD_PROCESS_SHARED;
141}
142
143/** @} */
144
145#endif
146/* end of include file */
Note: See TracBrowser for help on using the repository browser.