source: rtems/c/src/exec/score/inline/rtems/score/coremutex.inl @ 43b6f75

4.104.114.84.95
Last change on this file since 43b6f75 was 43b6f75, checked in by Joel Sherrill <joel.sherrill@…>, on 11/30/00 at 14:08:30

2000-11-30 Joel Sherrill <joel@…>

  • General effort to make things compile with macros not inlines
  • inline/rtems/score/coremutex.inl: Added comment indicating for macros there is another copy of _CORE_mutex_Seize_interrupt_trylock() in src/coremutexseize.c.
  • src/coremutexseize.c: Added body of _CORE_mutex_Seize_interrupt_trylock() for macro case.
  • macros/rtems/score/coremutex.inl: Added prototype for _CORE_mutex_Seize_interrupt_trylock() since there is a real body when macros are enabled.
  • macros/rtems/score/coresem.inl: Added macro implementation of _CORE_semaphore_Seize_isr_disable.
  • macros/score/Makefile.am: Fixed typos.
  • rtems/score/address.inl: Correct macro implementation of _Addresses_Is_aligned() so it would compile.
  • macros/rtems/score/coremsg.inl: Added closing parentheses.
  • Property mode set to 100644
File size: 4.7 KB
Line 
1/*  inline/coremutex.inl
2 *
3 *  This include file contains all of the inlined routines associated
4 *  with the CORE mutexes.
5 *
6 *  COPYRIGHT (c) 1989-1999.
7 *  On-Line Applications Research Corporation (OAR).
8 *
9 *  The license and distribution terms for this file may be
10 *  found in the file LICENSE in this distribution or at
11 *  http://www.OARcorp.com/rtems/license.html.
12 *
13 *  $Id$
14 */
15
16#ifndef __INLINE_CORE_MUTEX_inl
17#define __INLINE_CORE_MUTEX_inl
18
19/*PAGE
20 *
21 *  _CORE_mutex_Is_locked
22 *
23 *  DESCRIPTION:
24 *
25 *  This routine returns TRUE if the mutex specified is locked and FALSE
26 *  otherwise.
27 */
28 
29RTEMS_INLINE_ROUTINE boolean _CORE_mutex_Is_locked(
30  CORE_mutex_Control  *the_mutex
31)
32{
33  return the_mutex->lock == CORE_MUTEX_LOCKED;
34}
35 
36/*PAGE
37 *
38 *  _CORE_mutex_Is_fifo
39 *
40 *  DESCRIPTION:
41 *
42 *  This routine returns TRUE if the mutex's wait discipline is FIFO and FALSE
43 *  otherwise.
44 */
45 
46RTEMS_INLINE_ROUTINE boolean _CORE_mutex_Is_fifo(
47  CORE_mutex_Attributes *the_attribute
48)
49{
50  return the_attribute->discipline == CORE_MUTEX_DISCIPLINES_FIFO;
51}
52 
53/*PAGE
54 *
55 *  _CORE_mutex_Is_priority
56 *
57 *  DESCRIPTION:
58 *
59 *  This routine returns TRUE if the mutex's wait discipline is PRIORITY and
60 *  FALSE otherwise.
61 */
62 
63RTEMS_INLINE_ROUTINE boolean _CORE_mutex_Is_priority(
64  CORE_mutex_Attributes *the_attribute
65)
66{
67  return the_attribute->discipline == CORE_MUTEX_DISCIPLINES_PRIORITY;
68}
69 
70/*PAGE
71 *
72 *  _CORE_mutex_Is_inherit_priority
73 *
74 *  DESCRIPTION:
75 *
76 *  This routine returns TRUE if the mutex's wait discipline is
77 *  INHERIT_PRIORITY and FALSE otherwise.
78 */
79 
80RTEMS_INLINE_ROUTINE boolean _CORE_mutex_Is_inherit_priority(
81  CORE_mutex_Attributes *the_attribute
82)
83{
84  return the_attribute->discipline == CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT;
85}
86 
87/*PAGE
88 *
89 *  _CORE_mutex_Is_priority_ceiling
90 *
91 *  DESCRIPTION:
92 *
93 *  This routine returns TRUE if the mutex's wait discipline is
94 *  PRIORITY_CEILING and FALSE otherwise.
95 */
96 
97RTEMS_INLINE_ROUTINE boolean _CORE_mutex_Is_priority_ceiling(
98  CORE_mutex_Attributes *the_attribute
99)
100{
101  return the_attribute->discipline == CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING;
102}
103 
104/*PAGE
105 *
106 *  _CORE_mutex_Seize_interrupt_trylock
107 *
108 *  DESCRIPTION:
109 *
110 *  This routine returns 0 if "trylock" can resolve whether or not the
111 *  mutex is immediately obtained or there was an error attempting to
112 *  get it.  It returns 1 to indicate that the caller cannot obtain
113 *  the mutex and will have to block to do so.
114 *
115 *  NOTE: There is no MACRO version of this routine.
116 *        A body is in coremutexseize.c that is duplicated
117 *        from the .inl by hand.
118 */
119
120RTEMS_INLINE_ROUTINE int _CORE_mutex_Seize_interrupt_trylock(
121  CORE_mutex_Control  *the_mutex,
122  ISR_Level           *level_p
123)
124{
125  Thread_Control   *executing;
126  ISR_Level         level = *level_p;
127
128  /* disabled when you get here */
129
130  executing = _Thread_Executing;
131  executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL;
132  if ( !_CORE_mutex_Is_locked( the_mutex ) ) {
133    the_mutex->lock       = CORE_MUTEX_LOCKED;
134    the_mutex->holder     = executing;
135    the_mutex->holder_id  = executing->Object.id;
136    the_mutex->nest_count = 1;
137    executing->resource_count++;
138    if ( the_mutex->Attributes.discipline !=
139           CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING ) {
140        _ISR_Enable( level );
141        return 0;
142    }
143    /* else must be CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING */
144    {
145       Priority_Control  ceiling;
146       Priority_Control  current;
147
148       ceiling = the_mutex->Attributes.priority_ceiling;
149       current = executing->current_priority;
150       if ( current == ceiling ) {
151         _ISR_Enable( level );
152         return 0;
153       }
154       if ( current > ceiling ) {
155        _Thread_Disable_dispatch();
156        _ISR_Enable( level );
157        _Thread_Change_priority(
158          the_mutex->holder,
159          the_mutex->Attributes.priority_ceiling,
160          FALSE
161        );
162        _Thread_Enable_dispatch();
163        return 0;
164      }
165      /* if ( current < ceiling ) */ {
166        executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED;
167        the_mutex->nest_count = 0;     /* undo locking above */
168        executing->resource_count--;   /* undo locking above */
169        _ISR_Enable( level );
170        return 0;
171      }
172    }
173    return 0;
174  }
175
176  if ( _Thread_Is_executing( the_mutex->holder ) ) {
177    switch ( the_mutex->Attributes.lock_nesting_behavior ) {
178      case CORE_MUTEX_NESTING_ACQUIRES:
179        the_mutex->nest_count++;
180        _ISR_Enable( level );
181        return 0;
182      case CORE_MUTEX_NESTING_IS_ERROR:
183        executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED;
184        _ISR_Enable( level );
185        return 0;
186      case CORE_MUTEX_NESTING_BLOCKS:
187        break;
188    }
189  }
190
191  return 1;
192}
193
194#endif
195/* end of include file */
Note: See TracBrowser for help on using the repository browser.