source: rtems/cpukit/rtems/src/semtranslatereturncode.c @ d17c114

Last change on this file since d17c114 was d17c114, checked in by Joel Sherrill <joel.sherrill@…>, on 07/24/08 at 20:43:24

2008-07-24 Joel Sherrill <joel.sherrill@…>

PR 1291/cpukit

  • posix/src/posixtimespecabsolutetimeout.c: New file.
  • itron/inline/rtems/itron/semaphore.inl, itron/src/twai_sem.c, posix/Makefile.am, posix/include/mqueue.h, posix/include/rtems/posix/mqueue.h, posix/include/rtems/posix/semaphore.h, posix/include/rtems/posix/time.h, posix/src/condtimedwait.c, posix/src/mqueuereceive.c, posix/src/mqueuerecvsupp.c, posix/src/mqueuesend.c, posix/src/mqueuesendsupp.c, posix/src/mqueuetimedreceive.c, posix/src/mqueuetimedsend.c, posix/src/mutexfromcorestatus.c, posix/src/mutextimedlock.c, posix/src/semaphorewaitsupp.c, posix/src/semtimedwait.c, posix/src/semtrywait.c, posix/src/semwait.c, rtems/src/semobtain.c, rtems/src/semtranslatereturncode.c, score/include/rtems/score/coresem.h, score/src/coremsgseize.c, score/src/coresemseize.c: This patch addresses issues on implementation of the timeout on the following POSIX services. Some of these services incorrectly took a timeout as a relative time. Others would compute a 0 delta to timeout if the absolute time and the current time were equal and thus incorrectly block the caller forever. The root of the confusion is that POSIX specifies that if the timeout is incorrect (e.g. in the past, is now, or is numerically invalid), that it does not matter if the call would succeed without blocking. This is in contrast to RTEMS programming style where all errors are checked before any critical sections are entered. This fix implemented a more uniform way of handling POSIX absolute time timeouts.

+ pthread_cond_timedwait - could block forever
+ mq_timedreceive - used relative not absolute time
+ mq_timedsend - used relative not absolute time
+ pthread_mutex_timedlock - used relative not absolute time
+ pthread_rwlock_timedrdlock- used relative not absolute time
+ pthread_rwlock_timedwrlock- used relative not absolute time
+ sem_timedwait - could block forever

  • Property mode set to 100644
File size: 3.3 KB
Line 
1/*
2 *  Semaphore Manager
3 *
4 *  DESCRIPTION:
5 *
6 *  This package is the implementation of the Semaphore Manager.
7 *  This manager utilizes standard Dijkstra counting semaphores to provide
8 *  synchronization and mutual exclusion capabilities.
9 *
10 *  Directives provided are:
11 *
12 *     + create a semaphore
13 *     + get an ID of a semaphore
14 *     + delete a semaphore
15 *     + acquire a semaphore
16 *     + release a semaphore
17 *
18 *  COPYRIGHT (c) 1989-1999.
19 *  On-Line Applications Research Corporation (OAR).
20 *
21 *  The license and distribution terms for this file may be
22 *  found in the file LICENSE in this distribution or at
23 *  http://www.rtems.com/license/LICENSE.
24 *
25 *  $Id$
26 */
27
28#if HAVE_CONFIG_H
29#include "config.h"
30#endif
31
32#include <rtems/system.h>
33#include <rtems/rtems/status.h>
34#include <rtems/rtems/support.h>
35#include <rtems/rtems/attr.h>
36#include <rtems/score/isr.h>
37#include <rtems/score/object.h>
38#include <rtems/rtems/options.h>
39#include <rtems/rtems/sem.h>
40#include <rtems/score/coremutex.h>
41#include <rtems/score/coresem.h>
42#include <rtems/score/states.h>
43#include <rtems/score/thread.h>
44#include <rtems/score/threadq.h>
45#if defined(RTEMS_MULTIPROCESSING)
46#include <rtems/score/mpci.h>
47#endif
48#include <rtems/score/sysstate.h>
49
50#include <rtems/score/interr.h>
51
52/*PAGE
53 *
54 *  _Semaphore_Translate_core_mutex_return_code
55 *
56 *  Input parameters:
57 *    status - mutex status code to translate
58 *
59 *  Output parameters:
60 *    rtems status code - translated RTEMS status code
61 *
62 */
63
64rtems_status_code _Semaphore_Translate_core_mutex_return_code_[] = {
65  RTEMS_SUCCESSFUL,         /* CORE_MUTEX_STATUS_SUCCESSFUL */
66  RTEMS_UNSATISFIED,        /* CORE_MUTEX_STATUS_UNSATISFIED_NOWAIT */
67  RTEMS_UNSATISFIED,        /* CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED */
68  RTEMS_NOT_OWNER_OF_RESOURCE, /* CORE_MUTEX_STATUS_NOT_OWNER_OF_RESOURCE */
69  RTEMS_OBJECT_WAS_DELETED, /* CORE_MUTEX_WAS_DELETED */
70  RTEMS_TIMEOUT,            /* CORE_MUTEX_TIMEOUT */
71  RTEMS_INTERNAL_ERROR,     /* CORE_MUTEX_STATUS_CEILING_VIOLATED */
72};
73
74
75rtems_status_code _Semaphore_Translate_core_mutex_return_code (
76  uint32_t   status
77)
78{
79#if defined(RTEMS_MULTIPROCESSING)
80  if ( status == THREAD_STATUS_PROXY_BLOCKING )
81    return RTEMS_PROXY_BLOCKING;
82#endif
83  if ( status > CORE_MUTEX_STATUS_CEILING_VIOLATED )
84    return RTEMS_INTERNAL_ERROR;
85  return _Semaphore_Translate_core_mutex_return_code_[status];
86}
87
88/*PAGE
89 *
90 *  _Semaphore_Translate_core_semaphore_return_code
91 *
92 *  Input parameters:
93 *    status - semaphore status code to translate
94 *
95 *  Output parameters:
96 *    rtems status code - translated RTEMS status code
97 *
98 */
99
100rtems_status_code _Semaphore_Translate_core_semaphore_return_code_[] = {
101  RTEMS_SUCCESSFUL,         /* CORE_SEMAPHORE_STATUS_SUCCESSFUL */
102  RTEMS_UNSATISFIED,        /* CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT */
103  RTEMS_OBJECT_WAS_DELETED, /* CORE_SEMAPHORE_WAS_DELETED */
104  RTEMS_TIMEOUT,            /* CORE_SEMAPHORE_TIMEOUT  */
105  RTEMS_INTERNAL_ERROR,     /* CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED */
106};
107
108rtems_status_code _Semaphore_Translate_core_semaphore_return_code (
109  uint32_t   status
110)
111{
112#if defined(RTEMS_MULTIPROCESSING)
113  if ( status == THREAD_STATUS_PROXY_BLOCKING )
114    return RTEMS_PROXY_BLOCKING;
115#endif
116  if ( status > CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED )
117    return RTEMS_INTERNAL_ERROR;
118  return _Semaphore_Translate_core_semaphore_return_code_[status];
119}
Note: See TracBrowser for help on using the repository browser.