source: rtems/cpukit/rtems/src/partcreate.c @ 90015e7f

4.104.114.84.95
Last change on this file since 90015e7f was 90015e7f, checked in by Joel Sherrill <joel.sherrill@…>, on 07/01/02 at 22:32:31

2002-07-01 Joel Sherrill <joel@…>

  • Mega patch merge to change the format of the object IDs to loosen the dependency between the SCORE and the various APIs. There was considerable work to simplify the object name management and it appears that the name_table field is no longer needed. This patch also includes the addition of the internal mutex which is currently only used to protect some types of allocation and deallocation. This significantly can reduce context switch latency under certain circumstances. In particular, some heap/region operations were O(n) and had dispatching disabled. This should help enormously. With this merge, the patch is not as clean as it should be. In particular, the documentation has not been modified to reflect the new object ID layout, the IDs in the test screens are not updated, and _Objects_Get_information needs to be a real routine not inlined. As part of this patch a lot of MP code for thread/proxy blocking was made conditional and cleaned up.
  • include/rtems.h, inline/rtems/rtems/region.inl, macros/rtems/rtems/region.inl, src/dpmem.c, src/dpmemcreate.c, src/msg.c, src/msgqcreate.c, src/part.c, src/partcreate.c, src/ratemon.c, src/ratemoncreate.c, src/region.c, src/regioncreate.c, src/regiondelete.c, src/regionextend.c, src/regiongetinfo.c, src/regiongetsegment.c, src/regiongetsegmentsize.c, src/regionident.c, src/regionreturnsegment.c, src/rtemstimer.c, src/sem.c, src/semcreate.c, src/taskcreate.c, src/taskident.c, src/tasks.c, src/timercreate.c: Modified as part of above.
  • Property mode set to 100644
File size: 3.2 KB
Line 
1/*
2 *  Partition 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$
13 */
14
15#include <rtems/system.h>
16#include <rtems/rtems/status.h>
17#include <rtems/rtems/support.h>
18#include <rtems/score/address.h>
19#include <rtems/score/object.h>
20#include <rtems/rtems/part.h>
21#include <rtems/score/thread.h>
22#include <rtems/score/sysstate.h>
23
24/*PAGE
25 *
26 *  rtems_partition_create
27 *
28 *  This directive creates a partiton of fixed sized buffers from the
29 *  given contiguous memory area.
30 *
31 *  Input parameters:
32 *    name             - user defined partition name
33 *    starting_address - physical start address of partition
34 *    length           - physical length in bytes
35 *    buffer_size      - size of buffers in bytes
36 *    attribute_set    - partition attributes
37 *    id               - pointer to partition id
38 *
39 *  Output parameters:
40 *    id                - partition id
41 *    RTEMS_SUCCESSFUL - if successful
42 *    error code        - if unsuccessful
43 */
44
45rtems_status_code rtems_partition_create(
46  rtems_name          name,
47  void               *starting_address,
48  unsigned32          length,
49  unsigned32          buffer_size,
50  rtems_attribute  attribute_set,
51  Objects_Id         *id
52)
53{
54  register Partition_Control *the_partition;
55
56  if ( !rtems_is_name_valid( name ) )
57    return RTEMS_INVALID_NAME;
58
59  if ( length == 0 || buffer_size == 0 || length < buffer_size ||
60         !_Partition_Is_buffer_size_aligned( buffer_size ) )
61    return RTEMS_INVALID_SIZE;
62
63  if ( !_Addresses_Is_aligned( starting_address ) )
64     return RTEMS_INVALID_ADDRESS;
65
66#if defined(RTEMS_MULTIPROCESSING)
67  if ( _Attributes_Is_global( attribute_set ) &&
68       !_System_state_Is_multiprocessing )
69    return RTEMS_MP_NOT_CONFIGURED;
70#endif
71
72  _Thread_Disable_dispatch();               /* prevents deletion */
73
74  the_partition = _Partition_Allocate();
75
76  if ( !the_partition ) {
77    _Thread_Enable_dispatch();
78    return RTEMS_TOO_MANY;
79  }
80
81#if defined(RTEMS_MULTIPROCESSING)
82  if ( _Attributes_Is_global( attribute_set ) &&
83       !( _Objects_MP_Allocate_and_open( &_Partition_Information, name,
84                            the_partition->Object.id, FALSE ) ) ) {
85    _Partition_Free( the_partition );
86    _Thread_Enable_dispatch();
87    return RTEMS_TOO_MANY;
88  }
89#endif
90
91  the_partition->starting_address      = starting_address;
92  the_partition->length                = length;
93  the_partition->buffer_size           = buffer_size;
94  the_partition->attribute_set         = attribute_set;
95  the_partition->number_of_used_blocks = 0;
96
97  _Chain_Initialize( &the_partition->Memory, starting_address,
98                        length / buffer_size, buffer_size );
99
100  _Objects_Open( &_Partition_Information, &the_partition->Object, name );
101
102  *id = the_partition->Object.id;
103#if defined(RTEMS_MULTIPROCESSING)
104  if ( _Attributes_Is_global( attribute_set ) )
105    _Partition_MP_Send_process_packet(
106      PARTITION_MP_ANNOUNCE_CREATE,
107      the_partition->Object.id,
108      name,
109      0                  /* Not used */
110    );
111#endif
112
113  _Thread_Enable_dispatch();
114  return RTEMS_SUCCESSFUL;
115}
Note: See TracBrowser for help on using the repository browser.