source:
rtems/cpukit/rtems/src/regiongetsegment.c
@
e980b219
Last change on this file since e980b219 was e980b219, checked in by Joel Sherrill <joel.sherrill@…>, on 05/06/04 at 19:21:40 | |
---|---|
|
|
File size: 3.0 KB |
Rev | Line | |
---|---|---|
[5aa64518] | 1 | /* |
2 | * Region Manager | |
3 | * | |
4 | * | |
[08311cc3] | 5 | * COPYRIGHT (c) 1989-1999. |
[5aa64518] | 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 | |
[277cc95] | 10 | * http://www.rtems.com/license/LICENSE. |
[5aa64518] | 11 | * |
12 | * $Id$ | |
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> | |
[90015e7f] | 23 | #include <rtems/score/apimutex.h> |
[5aa64518] | 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, | |
[1d496f6] | 46 | uint32_t size, |
[5aa64518] | 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 | ||
[e980b219] | 57 | if ( !segment ) |
58 | return RTEMS_INVALID_ADDRESS; | |
59 | ||
[5aa64518] | 60 | *segment = NULL; |
61 | ||
62 | if ( size == 0 ) | |
63 | return RTEMS_INVALID_SIZE; | |
64 | ||
[90015e7f] | 65 | _RTEMS_Lock_allocator(); |
[5aa64518] | 66 | executing = _Thread_Executing; |
67 | the_region = _Region_Get( id, &location ); | |
68 | switch ( location ) { | |
69 | case OBJECTS_REMOTE: /* this error cannot be returned */ | |
[90015e7f] | 70 | _RTEMS_Unlock_allocator(); |
[5aa64518] | 71 | return RTEMS_INTERNAL_ERROR; |
72 | ||
73 | case OBJECTS_ERROR: | |
[90015e7f] | 74 | _RTEMS_Unlock_allocator(); |
[5aa64518] | 75 | return RTEMS_INVALID_ID; |
76 | ||
77 | case OBJECTS_LOCAL: | |
78 | if ( size > the_region->maximum_segment_size ) { | |
[90015e7f] | 79 | _RTEMS_Unlock_allocator(); |
[5aa64518] | 80 | return RTEMS_INVALID_SIZE; |
81 | } | |
82 | ||
83 | _Region_Debug_Walk( the_region, 1 ); | |
84 | ||
85 | the_segment = _Region_Allocate_segment( the_region, size ); | |
86 | ||
87 | _Region_Debug_Walk( the_region, 2 ); | |
88 | ||
89 | if ( the_segment ) { | |
90 | the_region->number_of_used_blocks += 1; | |
[90015e7f] | 91 | _RTEMS_Unlock_allocator(); |
[5aa64518] | 92 | *segment = the_segment; |
93 | return RTEMS_SUCCESSFUL; | |
94 | } | |
95 | ||
96 | if ( _Options_Is_no_wait( option_set ) ) { | |
[90015e7f] | 97 | _RTEMS_Unlock_allocator(); |
[5aa64518] | 98 | return RTEMS_UNSATISFIED; |
99 | } | |
100 | ||
101 | executing->Wait.queue = &the_region->Wait_queue; | |
102 | executing->Wait.id = id; | |
103 | executing->Wait.count = size; | |
[6e30d97] | 104 | executing->Wait.return_argument = segment; |
[5aa64518] | 105 | |
106 | _Thread_queue_Enter_critical_section( &the_region->Wait_queue ); | |
107 | ||
108 | _Thread_queue_Enqueue( &the_region->Wait_queue, timeout ); | |
109 | ||
[90015e7f] | 110 | _RTEMS_Unlock_allocator(); |
[5aa64518] | 111 | return (rtems_status_code) executing->Wait.return_code; |
112 | } | |
113 | ||
114 | return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ | |
115 | } |
Note: See TracBrowser
for help on using the repository browser.