OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [rtos/] [rtems/] [c/] [src/] [exec/] [rtems/] [src/] [regiongetsegment.c] - Blame information for rev 173

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 30 unneback
/*
2
 *  Region Manager
3
 *
4
 *
5
 *  COPYRIGHT (c) 1989-1999.
6
 *  On-Line Applications Research Corporation (OAR).
7
 *
8
 *  The license and distribution terms for this file may be
9
 *  found in the file LICENSE in this distribution or at
10
 *  http://www.OARcorp.com/rtems/license.html.
11
 *
12
 *  $Id: regiongetsegment.c,v 1.2 2001-09-27 11:59:19 chris Exp $
13
 */
14
 
15
#include <rtems/system.h>
16
#include <rtems/rtems/status.h>
17
#include <rtems/rtems/support.h>
18
#include <rtems/score/object.h>
19
#include <rtems/rtems/options.h>
20
#include <rtems/rtems/region.h>
21
#include <rtems/score/states.h>
22
#include <rtems/score/thread.h>
23
 
24
/*PAGE
25
 *
26
 *  rtems_region_get_segment
27
 *
28
 *  This directive will obtain a segment from the given region.
29
 *
30
 *  Input parameters:
31
 *    id         - region id
32
 *    size       - segment size in bytes
33
 *    option_set - wait option
34
 *    timeout    - number of ticks to wait (0 means wait forever)
35
 *    segment    - pointer to segment address
36
 *
37
 *  Output parameters:
38
 *    segment    - pointer to segment address filled in
39
 *    RTEMS_SUCCESSFUL - if successful
40
 *    error code - if unsuccessful
41
 */
42
 
43
rtems_status_code rtems_region_get_segment(
44
  Objects_Id         id,
45
  unsigned32         size,
46
  rtems_option       option_set,
47
  rtems_interval     timeout,
48
  void              **segment
49
)
50
{
51
  register Region_Control *the_region;
52
  Objects_Locations        location;
53
  Thread_Control          *executing;
54
  void                    *the_segment;
55
 
56
  *segment = NULL;
57
 
58
  if ( size == 0 )
59
    return RTEMS_INVALID_SIZE;
60
 
61
  executing  = _Thread_Executing;
62
  the_region = _Region_Get( id, &location );
63
  switch ( location ) {
64
    case OBJECTS_REMOTE:        /* this error cannot be returned */
65
      return RTEMS_INTERNAL_ERROR;
66
 
67
    case OBJECTS_ERROR:
68
      return RTEMS_INVALID_ID;
69
 
70
    case OBJECTS_LOCAL:
71
      if ( size > the_region->maximum_segment_size ) {
72
        _Thread_Enable_dispatch();
73
        return RTEMS_INVALID_SIZE;
74
      }
75
 
76
      _Region_Debug_Walk( the_region, 1 );
77
 
78
      the_segment = _Region_Allocate_segment( the_region, size );
79
 
80
      _Region_Debug_Walk( the_region, 2 );
81
 
82
      if ( the_segment ) {
83
        the_region->number_of_used_blocks += 1;
84
        _Thread_Enable_dispatch();
85
        *segment = the_segment;
86
        return RTEMS_SUCCESSFUL;
87
      }
88
 
89
      if ( _Options_Is_no_wait( option_set ) ) {
90
        _Thread_Enable_dispatch();
91
        return RTEMS_UNSATISFIED;
92
      }
93
 
94
      executing->Wait.queue           = &the_region->Wait_queue;
95
      executing->Wait.id              = id;
96
      executing->Wait.count           = size;
97
      executing->Wait.return_argument = (unsigned32 *) segment;
98
 
99
      _Thread_queue_Enter_critical_section( &the_region->Wait_queue );
100
 
101
      _Thread_queue_Enqueue( &the_region->Wait_queue, timeout );
102
 
103
      _Thread_Enable_dispatch();
104
      return (rtems_status_code) executing->Wait.return_code;
105
  }
106
 
107
  return RTEMS_INTERNAL_ERROR;   /* unreached - only to remove warnings */
108
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.