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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [rtems-20020807/] [cpukit/] [rtems/] [src/] [regiongetsegment.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1026 ivang
/*
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
 *  regiongetsegment.c,v 1.3 2002/07/01 22:32:31 joel 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
#include <rtems/score/apimutex.h>
24
 
25
/*PAGE
26
 *
27
 *  rtems_region_get_segment
28
 *
29
 *  This directive will obtain a segment from the given region.
30
 *
31
 *  Input parameters:
32
 *    id         - region id
33
 *    size       - segment size in bytes
34
 *    option_set - wait option
35
 *    timeout    - number of ticks to wait (0 means wait forever)
36
 *    segment    - pointer to segment address
37
 *
38
 *  Output parameters:
39
 *    segment    - pointer to segment address filled in
40
 *    RTEMS_SUCCESSFUL - if successful
41
 *    error code - if unsuccessful
42
 */
43
 
44
rtems_status_code rtems_region_get_segment(
45
  Objects_Id         id,
46
  unsigned32         size,
47
  rtems_option       option_set,
48
  rtems_interval     timeout,
49
  void              **segment
50
)
51
{
52
  register Region_Control *the_region;
53
  Objects_Locations        location;
54
  Thread_Control          *executing;
55
  void                    *the_segment;
56
 
57
  *segment = NULL;
58
 
59
  if ( size == 0 )
60
    return RTEMS_INVALID_SIZE;
61
 
62
  _RTEMS_Lock_allocator();
63
  executing  = _Thread_Executing;
64
  the_region = _Region_Get( id, &location );
65
  switch ( location ) {
66
    case OBJECTS_REMOTE:        /* this error cannot be returned */
67
      _RTEMS_Unlock_allocator();
68
      return RTEMS_INTERNAL_ERROR;
69
 
70
    case OBJECTS_ERROR:
71
      _RTEMS_Unlock_allocator();
72
      return RTEMS_INVALID_ID;
73
 
74
    case OBJECTS_LOCAL:
75
      if ( size > the_region->maximum_segment_size ) {
76
        _RTEMS_Unlock_allocator();
77
        return RTEMS_INVALID_SIZE;
78
      }
79
 
80
      _Region_Debug_Walk( the_region, 1 );
81
 
82
      the_segment = _Region_Allocate_segment( the_region, size );
83
 
84
      _Region_Debug_Walk( the_region, 2 );
85
 
86
      if ( the_segment ) {
87
        the_region->number_of_used_blocks += 1;
88
        _RTEMS_Unlock_allocator();
89
        *segment = the_segment;
90
        return RTEMS_SUCCESSFUL;
91
      }
92
 
93
      if ( _Options_Is_no_wait( option_set ) ) {
94
        _RTEMS_Unlock_allocator();
95
        return RTEMS_UNSATISFIED;
96
      }
97
 
98
      executing->Wait.queue           = &the_region->Wait_queue;
99
      executing->Wait.id              = id;
100
      executing->Wait.count           = size;
101
      executing->Wait.return_argument = (unsigned32 *) segment;
102
 
103
      _Thread_queue_Enter_critical_section( &the_region->Wait_queue );
104
 
105
      _Thread_queue_Enqueue( &the_region->Wait_queue, timeout );
106
 
107
      _RTEMS_Unlock_allocator();
108
      return (rtems_status_code) executing->Wait.return_code;
109
  }
110
 
111
  return RTEMS_INTERNAL_ERROR;   /* unreached - only to remove warnings */
112
}

powered by: WebSVN 2.1.0

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