source: rtems/cpukit/score/src/coresemseize.c @ b72e847b

4.8
Last change on this file since b72e847b was a2cf229, checked in by Joel Sherrill <joel.sherrill@…>, on 07/22/08 at 17:17:12

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

PR 1291/cpukit

  • itron/inline/rtems/itron/semaphore.inl, itron/src/twai_sem.c, 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/mutextimedlock.c, posix/src/mutextranslatereturncode.c, posix/src/posixtimespecabsolutetimeout.c, posix/src/prwlocktimedrdlock.c, posix/src/prwlocktimedwrlock.c, posix/src/semaphoretranslatereturncode.c, posix/src/semaphorewaitsupp.c, posix/src/semtimedwait.c, posix/src/semtrywait.c, posix/src/semwait.c, posix/src/sigtimedwait.c, posix/src/timersettime.c, posix/src/ualarm.c, rtems/src/semobtain.c, rtems/src/semtranslatereturncode.c, score/include/rtems/score/coremutex.h, score/include/rtems/score/coresem.h, 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: 2.2 KB
Line 
1/*
2 *  CORE Semaphore Handler
3 *
4 *  DESCRIPTION:
5 *
6 *  This package is the implementation of the CORE Semaphore Handler.
7 *  This core object utilizes standard Dijkstra counting semaphores to provide
8 *  synchronization and mutual exclusion capabilities.
9 *
10 *  COPYRIGHT (c) 1989-1999.
11 *  On-Line Applications Research Corporation (OAR).
12 *
13 *  The license and distribution terms for this file may be
14 *  found in the file LICENSE in this distribution or at
15 *  http://www.rtems.com/license/LICENSE.
16 *
17 *  $Id$
18 */
19
20#if HAVE_CONFIG_H
21#include "config.h"
22#endif
23
24#include <rtems/system.h>
25#include <rtems/score/isr.h>
26#include <rtems/score/coresem.h>
27#include <rtems/score/states.h>
28#include <rtems/score/thread.h>
29#include <rtems/score/threadq.h>
30#if defined(RTEMS_MULTIPROCESSING)
31#include <rtems/score/mpci.h>
32#endif
33
34/*PAGE
35 *
36 *  _CORE_semaphore_Seize
37 *
38 *  This routine attempts to allocate a core semaphore to the calling thread.
39 *
40 *  Input parameters:
41 *    the_semaphore - pointer to semaphore control block
42 *    id            - id of object to wait on
43 *    wait          - TRUE if wait is allowed, FALSE otherwise
44 *    timeout       - number of ticks to wait (0 means forever)
45 *
46 *  Output parameters:  NONE
47 *
48 *  INTERRUPT LATENCY:
49 *    available
50 *    wait
51 */
52
53void _CORE_semaphore_Seize(
54  CORE_semaphore_Control *the_semaphore,
55  Objects_Id              id,
56  boolean                 wait,
57  Watchdog_Interval       timeout
58)
59{
60  Thread_Control *executing;
61  ISR_Level       level;
62
63  executing = _Thread_Executing;
64  executing->Wait.return_code = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
65  _ISR_Disable( level );
66  if ( the_semaphore->count != 0 ) {
67    the_semaphore->count -= 1;
68    _ISR_Enable( level );
69    return;
70  }
71
72  if ( !wait ) {
73    _ISR_Enable( level );
74    executing->Wait.return_code = CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT;
75    return;
76  }
77
78   /*
79    *  If the semaphore is not available and the caller is willing to
80    *  block, then we now block the caller with optional timeout.
81    */
82  _Thread_queue_Enter_critical_section( &the_semaphore->Wait_queue );
83  executing->Wait.queue = &the_semaphore->Wait_queue;
84  executing->Wait.id    = id;
85  _ISR_Enable( level );
86  _Thread_queue_Enqueue( &the_semaphore->Wait_queue, timeout );
87
88}
Note: See TracBrowser for help on using the repository browser.