source: rtems/cpukit/itron/src/itronsem.c @ 352c9b2

4.104.114.84.95
Last change on this file since 352c9b2 was 352c9b2, checked in by Joel Sherrill <joel.sherrill@…>, on 11/09/99 at 22:07:23

This patch adds the basic framework for the ITRON 3.0 API implementation
for RTEMS.

  • Property mode set to 100644
File size: 7.9 KB
Line 
1/*
2 *  The license and distribution terms for this file may be
3 *  found in the file LICENSE in this distribution or at
4 *  http://www.OARcorp.com/rtems/license.html.
5 *
6 *  $Id$
7 */
8
9#include <itron.h>
10
11#include <rtems/itron/semaphore.h>
12#include <rtems/itron/task.h>
13#include <rtems/score/tod.h>
14
15/*
16 *  _ITRON_Semaphore_Manager_initialization
17 *
18 *  DESCRIPTION:
19 *
20 *  This routine initializes all semaphore manager related data structures.
21 *
22 *  Input parameters:
23 *    maximum_semaphores - maximum configured semaphores
24 *
25 *  Output parameters:  NONE
26 */
27
28void _ITRON_Semaphore_Manager_initialization(
29  unsigned32 maximum_semaphores
30)
31{
32  _Objects_Initialize_information(
33    &_ITRON_Semaphore_Information,     /* object information table */
34    OBJECTS_ITRON_SEMAPHORES,          /* object class */
35    FALSE,                             /* TRUE if this is a global */
36                                       /*   object class */
37    maximum_semaphores,                /* maximum objects of this class */
38    sizeof( ITRON_Semaphore_Control ), /* size of this object's control block */
39    FALSE,                             /* TRUE if names for this object */
40                                       /*   are strings */
41    RTEMS_MAXIMUM_NAME_LENGTH,         /* maximum length of each object's */
42                                       /*   name */
43    FALSE                              /* TRUE if this class is threads */
44  );
45
46  /*
47   *  Register the MP Process Packet routine.
48   *
49   *  NOTE: No MP Support YET in RTEMS ITRON implementation.
50   */
51
52}
53
54/*
55 *  cre_sem - Create Semaphore
56 *
57 *  This function implements the ITRON 3.0 cre_sem() service.
58 */
59
60ER cre_sem(
61  ID      semid,
62  T_CSEM *pk_csem
63)
64{
65  CORE_semaphore_Attributes   the_semaphore_attributes;
66  ITRON_Semaphore_Control    *the_semaphore;
67
68  /*
69   *  Bad pointer to the attributes structure
70   */
71
72  if ( !pk_csem )
73    return E_PAR;
74
75  /*
76   *  Bits were set that were note defined.
77   */
78
79  if ( pk_csem->sematr & _ITRON_SEMAPHORE_UNUSED_ATTRIBUTES )
80    return E_RSATR;
81
82  /*
83   *  Initial semaphore count exceeds the maximum.
84   */
85
86  if ( pk_csem->isemcnt > pk_csem->maxsem )
87    return E_PAR;
88
89  /*
90   *  This error is not in the specification but this condition
91   *  does not make sense.
92   */
93
94  if ( pk_csem->maxsem == 0 )
95    return E_PAR;
96
97  _Thread_Disable_dispatch();             /* prevents deletion */
98
99  the_semaphore = _ITRON_Semaphore_Allocate( semid );
100  if ( !the_semaphore ) {
101    _Thread_Enable_dispatch();
102    return _ITRON_Semaphore_Clarify_allocation_id_error( semid );
103  }
104
105  if ( pk_csem->sematr & TA_TPRI )
106    the_semaphore_attributes.discipline = CORE_SEMAPHORE_DISCIPLINES_PRIORITY;
107  else
108    the_semaphore_attributes.discipline = CORE_SEMAPHORE_DISCIPLINES_FIFO;
109
110  the_semaphore_attributes.maximum_count = pk_csem->maxsem;
111
112  _CORE_semaphore_Initialize(
113    &the_semaphore->semaphore,
114    OBJECTS_ITRON_SEMAPHORES,
115    &the_semaphore_attributes,
116    pk_csem->isemcnt,
117    NULL                           /* Multiprocessing not supported */
118  );
119
120  _ITRON_Objects_Open( &_ITRON_Semaphore_Information, &the_semaphore->Object );
121
122  /*
123   *  If multiprocessing were supported, this is where we would announce
124   *  the existence of the semaphore to the rest of the system.
125   */
126
127#if defined(RTEMS_MULTIPROCESSING)
128#endif
129
130  _Thread_Enable_dispatch();
131  return E_OK;
132}
133
134/*
135 *  del_sem - Delete Semaphore
136 *
137 *  This function implements the ITRON 3.0 del_sem() service.
138 */
139
140ER del_sem(
141  ID semid
142)
143{
144  ITRON_Semaphore_Control *the_semaphore;
145  Objects_Locations        location;
146 
147  the_semaphore = _ITRON_Semaphore_Get( semid, &location );
148  switch ( location ) {
149    case OBJECTS_REMOTE:               /* Multiprocessing not supported */
150    case OBJECTS_ERROR:
151      return _ITRON_Semaphore_Clarify_get_id_error( semid );
152 
153    case OBJECTS_LOCAL:
154      _CORE_semaphore_Flush(
155        &the_semaphore->semaphore,
156        NULL,                          /* Multiprocessing not supported */
157        CORE_SEMAPHORE_WAS_DELETED
158      );
159
160      _ITRON_Objects_Close(
161        &_ITRON_Semaphore_Information,
162        &the_semaphore->Object
163      );
164
165      _ITRON_Semaphore_Free( the_semaphore );
166
167  /*
168   *  If multiprocessing were supported, this is where we would announce
169   *  the destruction of the semaphore to the rest of the system.
170   */
171
172#if defined(RTEMS_MULTIPROCESSING)
173#endif
174
175    _Thread_Enable_dispatch();
176    return E_OK;
177
178  }
179  return E_OK;
180}
181
182/*
183 *  sig_sem - Signal Semaphore
184 *
185 *  This function implements the ITRON 3.0 sig_sem() service.
186 */
187
188ER sig_sem(
189  ID semid
190)
191{
192  ITRON_Semaphore_Control *the_semaphore;
193  Objects_Locations        location;
194  CORE_semaphore_Status    status;
195
196  the_semaphore = _ITRON_Semaphore_Get( semid, &location );
197  switch ( location ) {
198    case OBJECTS_REMOTE:               /* Multiprocessing not supported */
199    case OBJECTS_ERROR:
200      return _ITRON_Semaphore_Clarify_get_id_error( semid );
201
202    case OBJECTS_LOCAL:
203      /*
204       *  XXX maxsemcnt
205       */
206
207      status = _CORE_semaphore_Surrender(
208        &the_semaphore->semaphore,
209        the_semaphore->Object.id,
210        NULL                       /* Multiprocessing not supported */
211      );
212      _Thread_Enable_dispatch();
213      return _ITRON_Semaphore_Translate_core_semaphore_return_code( status );
214  }
215  return E_OK;
216}
217
218/*
219 *  wai_sem - Wait on Semaphore
220 *
221 *  This function implements the ITRON 3.0 wai_sem() service.
222 */
223
224ER wai_sem(
225  ID semid
226)
227{
228  return twai_sem( semid, TMO_FEVR );
229}
230
231/*
232 *  preq_sem - Poll and Request Semaphore
233 *
234 *  This function implements the ITRON 3.0 preq_sem() service.
235 */
236
237ER preq_sem(
238  ID semid
239)
240{
241  return twai_sem( semid, TMO_POL );
242}
243
244/*
245 *  twai_sem - Wait on Semaphore with Timeout
246 *
247 *  This function implements the ITRON 3.0 twai_sem() service.
248 */
249
250ER twai_sem(
251  ID semid,
252  TMO tmout
253)
254{
255  ITRON_Semaphore_Control *the_semaphore;
256  Objects_Locations        location;
257  Watchdog_Interval        interval;
258  boolean                  wait;
259  CORE_semaphore_Status    status;
260 
261  interval = 0;
262  if ( tmout == TMO_POL ) {
263    wait = FALSE;
264  } else {
265    wait = TRUE;
266    if ( tmout != TMO_FEVR )
267      interval = TOD_MILLISECONDS_TO_TICKS(tmout);
268  }
269
270  if ( wait && _ITRON_Is_in_non_task_state() )
271    return E_CTX;
272 
273  the_semaphore = _ITRON_Semaphore_Get( semid, &location );
274  switch ( location ) {
275    case OBJECTS_REMOTE:               /* Multiprocessing not supported */
276    case OBJECTS_ERROR:
277      return _ITRON_Semaphore_Clarify_get_id_error( semid );
278
279    case OBJECTS_LOCAL:
280      _CORE_semaphore_Seize(
281        &the_semaphore->semaphore,
282        the_semaphore->Object.id,
283        wait,                           /* wait for a timeout */
284        interval                        /* timeout value */
285      );
286      _Thread_Enable_dispatch();
287      status = (CORE_semaphore_Status) _Thread_Executing->Wait.return_code;
288      return _ITRON_Semaphore_Translate_core_semaphore_return_code( status );
289  }
290  return E_OK;
291}
292
293/*
294 *  ref_sem - Reference Semaphore Status
295 *
296 *  This function implements the ITRON 3.0 ref_sem() service.
297 */
298
299ER ref_sem(
300  ID      semid,
301  T_RSEM *pk_rsem
302)
303{
304  ITRON_Semaphore_Control *the_semaphore;
305  Objects_Locations        location;
306 
307  if ( !pk_rsem )
308    return E_PAR;   /* XXX check this error code */
309
310  the_semaphore = _ITRON_Semaphore_Get( semid, &location );
311  switch ( location ) {   
312    case OBJECTS_REMOTE:               /* Multiprocessing not supported */
313    case OBJECTS_ERROR:
314      return _ITRON_Semaphore_Clarify_get_id_error( semid );
315 
316    case OBJECTS_LOCAL:
317      /*
318       *  Fill in the current semaphore count
319       */
320
321      pk_rsem->semcnt = _CORE_semaphore_Get_count( &the_semaphore->semaphore );
322
323      /*
324       *  Fill in whether or not there is a waiting task
325       */
326
327      if ( !_Thread_queue_First( &the_semaphore->semaphore.Wait_queue ) )
328        pk_rsem->wtsk = FALSE;
329      else
330        pk_rsem->wtsk = TRUE;
331
332      _Thread_Enable_dispatch();
333      return E_OK;
334  }   
335  return E_OK;
336}
337
Note: See TracBrowser for help on using the repository browser.