Split Partition Manager into one routine per file.

This commit is contained in:
Joel Sherrill
1999-05-17 23:15:20 +00:00
parent be47df9381
commit 842db5f391
13 changed files with 843 additions and 606 deletions

View File

@@ -31,10 +31,6 @@ TIMER_PIECES=\
timer timercancel timercreate timerdelete timerfireafter \ timer timercancel timercreate timerdelete timerfireafter \
timerfirewhere timerident timerreset timerfirewhere timerident timerreset
REGION_PIECES=\
region regioncreate regiondelete regionextend regiongetsegment \
regiongetsegmentsize regionident regionreturnsegemnt regionreturnsegemnt
MESSAGE_QUEUE_PIECES=\ MESSAGE_QUEUE_PIECES=\
msg msgqallocate msgqbroadcast msgqcreate msgqdelete \ msg msgqallocate msgqbroadcast msgqcreate msgqdelete \
msgqflush msgqgetnumberpending msgqident msgqreceive \ msgqflush msgqgetnumberpending msgqident msgqreceive \
@@ -51,10 +47,21 @@ RATEMON_PIECES=\
ratemon ratemoncancel ratemoncreate ratemondelete ratemongetstatus \ ratemon ratemoncancel ratemoncreate ratemondelete ratemongetstatus \
ratemonident ratemonperiod ratemontimeout ratemonident ratemonperiod ratemontimeout
C_PIECES=attr $(CLOCK_PIECES) dpmem $(EVENT_PIECES) intr intrbody \ REGION_PIECES=\
$(MESSAGE_QUEUE_PIECES) \ region regioncreate regiondelete regionextend regiongetsegment \
part $(RATEMON_PIECES) $(REGION_PIECES) $(SEMAPHORE_PIECES) signal \ regiongetsegmentsize regionident regionreturnsegemnt regionreturnsegemnt
$(TASK_PIECES) $(TIMER_PIECES) $(MP_PIECES)
PARTITION_PIECES=\
part partcreate partdelete partgetbuffer partident partreturnbuffer
C_PIECES=\
attr $(TASK_PIECES) $(RATEMON_PIECES) \
intr intrbody \
$(CLOCK_PIECES) $(TIMER_PIECES) \
$(SEMAPHORE_PIECES) $(MESSAGE_QUEUE_PIECES) \
$(EVENT_PIECES) signal
$(PARTITION_PIECES) $(REGION_PIECES) dpmem \
$(MP_PIECES)
C_FILES=$(C_PIECES:%=%.c) C_FILES=$(C_PIECES:%=%.c)
C_O_FILES=$(C_PIECES:%=${ARCH}/%.o) C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)

View File

@@ -62,302 +62,3 @@ void _Partition_Manager_initialization(
#endif #endif
} }
/*PAGE
*
* rtems_partition_create
*
* This directive creates a partiton of fixed sized buffers from the
* given contiguous memory area.
*
* Input parameters:
* name - user defined partition name
* starting_address - physical start address of partition
* length - physical length in bytes
* buffer_size - size of buffers in bytes
* attribute_set - partition attributes
* id - pointer to partition id
*
* Output parameters:
* id - partition id
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_partition_create(
rtems_name name,
void *starting_address,
unsigned32 length,
unsigned32 buffer_size,
rtems_attribute attribute_set,
Objects_Id *id
)
{
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
!_Partition_Is_buffer_size_aligned( buffer_size ) )
return RTEMS_INVALID_SIZE;
if ( !_Addresses_Is_aligned( starting_address ) )
return RTEMS_INVALID_ADDRESS;
#if defined(RTEMS_MULTIPROCESSING)
if ( _Attributes_Is_global( attribute_set ) &&
!_System_state_Is_multiprocessing )
return RTEMS_MP_NOT_CONFIGURED;
#endif
_Thread_Disable_dispatch(); /* prevents deletion */
the_partition = _Partition_Allocate();
if ( !the_partition ) {
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#if defined(RTEMS_MULTIPROCESSING)
if ( _Attributes_Is_global( attribute_set ) &&
!( _Objects_MP_Allocate_and_open( &_Partition_Information, name,
the_partition->Object.id, FALSE ) ) ) {
_Partition_Free( the_partition );
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#endif
the_partition->starting_address = starting_address;
the_partition->length = length;
the_partition->buffer_size = buffer_size;
the_partition->attribute_set = attribute_set;
the_partition->number_of_used_blocks = 0;
_Chain_Initialize( &the_partition->Memory, starting_address,
length / buffer_size, buffer_size );
_Objects_Open( &_Partition_Information, &the_partition->Object, &name );
*id = the_partition->Object.id;
#if defined(RTEMS_MULTIPROCESSING)
if ( _Attributes_Is_global( attribute_set ) )
_Partition_MP_Send_process_packet(
PARTITION_MP_ANNOUNCE_CREATE,
the_partition->Object.id,
name,
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
/*PAGE
*
* rtems_partition_ident
*
* This directive returns the system ID associated with
* the partition name.
*
* Input parameters:
* name - user defined partition name
* node - node(s) to be searched
* id - pointer to partition id
*
* Output parameters:
* *id - partition id
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_partition_ident(
rtems_name name,
unsigned32 node,
Objects_Id *id
)
{
Objects_Name_to_id_errors status;
status = _Objects_Name_to_id( &_Partition_Information, &name, node, id );
return _Status_Object_name_errors_to_status[ status ];
}
/*PAGE
*
* rtems_partition_delete
*
* This directive allows a thread to delete a partition specified by
* the partition identifier, provided that none of its buffers are
* still allocated.
*
* Input parameters:
* id - partition id
*
* Output parameters:
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_partition_delete(
Objects_Id id
)
{
register Partition_Control *the_partition;
Objects_Locations location;
the_partition = _Partition_Get( id, &location );
switch ( location ) {
case OBJECTS_REMOTE:
#if defined(RTEMS_MULTIPROCESSING)
_Thread_Dispatch();
return RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
#endif
case OBJECTS_ERROR:
return RTEMS_INVALID_ID;
case OBJECTS_LOCAL:
if ( the_partition->number_of_used_blocks == 0 ) {
_Objects_Close( &_Partition_Information, &the_partition->Object );
_Partition_Free( the_partition );
#if defined(RTEMS_MULTIPROCESSING)
if ( _Attributes_Is_global( the_partition->attribute_set ) ) {
_Objects_MP_Close(
&_Partition_Information,
the_partition->Object.id
);
_Partition_MP_Send_process_packet(
PARTITION_MP_ANNOUNCE_DELETE,
the_partition->Object.id,
0, /* Not used */
0 /* Not used */
);
}
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
return RTEMS_RESOURCE_IN_USE;
}
return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
*
* rtems_partition_get_buffer
*
* This directive will obtain a buffer from a buffer partition.
*
* Input parameters:
* id - partition id
* buffer - pointer to buffer address
*
* Output parameters:
* buffer - pointer to buffer address filled in
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_partition_get_buffer(
Objects_Id id,
void **buffer
)
{
register Partition_Control *the_partition;
Objects_Locations location;
void *the_buffer;
the_partition = _Partition_Get( id, &location );
switch ( location ) {
case OBJECTS_REMOTE:
#if defined(RTEMS_MULTIPROCESSING)
_Thread_Executing->Wait.return_argument = buffer;
return(
_Partition_MP_Send_request_packet(
PARTITION_MP_GET_BUFFER_REQUEST,
id,
0 /* Not used */
)
);
#endif
case OBJECTS_ERROR:
return RTEMS_INVALID_ID;
case OBJECTS_LOCAL:
the_buffer = _Partition_Allocate_buffer( the_partition );
if ( the_buffer ) {
the_partition->number_of_used_blocks += 1;
_Thread_Enable_dispatch();
*buffer = the_buffer;
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
return RTEMS_UNSATISFIED;
}
return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
*
* rtems_partition_return_buffer
*
* This directive will return the given buffer to the specified
* buffer partition.
*
* Input parameters:
* id - partition id
* buffer - pointer to buffer address
*
* Output parameters:
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_partition_return_buffer(
Objects_Id id,
void *buffer
)
{
register Partition_Control *the_partition;
Objects_Locations location;
the_partition = _Partition_Get( id, &location );
switch ( location ) {
case OBJECTS_REMOTE:
#if defined(RTEMS_MULTIPROCESSING)
return _Partition_MP_Send_request_packet(
PARTITION_MP_RETURN_BUFFER_REQUEST,
id,
buffer
);
#endif
case OBJECTS_ERROR:
return RTEMS_INVALID_ID;
case OBJECTS_LOCAL:
if ( _Partition_Is_buffer_valid( buffer, the_partition ) ) {
_Partition_Free_buffer( the_partition, buffer );
the_partition->number_of_used_blocks -= 1;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
return RTEMS_INVALID_ADDRESS;
}
return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}

View File

@@ -0,0 +1,116 @@
/*
* Partition Manager
*
*
* COPYRIGHT (c) 1989-1998.
* On-Line Applications Research Corporation (OAR).
* Copyright assigned to U.S. Government, 1994.
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id$
*/
#include <rtems/system.h>
#include <rtems/rtems/status.h>
#include <rtems/rtems/support.h>
#include <rtems/score/address.h>
#include <rtems/score/object.h>
#include <rtems/rtems/part.h>
#include <rtems/score/thread.h>
#include <rtems/score/sysstate.h>
/*PAGE
*
* rtems_partition_create
*
* This directive creates a partiton of fixed sized buffers from the
* given contiguous memory area.
*
* Input parameters:
* name - user defined partition name
* starting_address - physical start address of partition
* length - physical length in bytes
* buffer_size - size of buffers in bytes
* attribute_set - partition attributes
* id - pointer to partition id
*
* Output parameters:
* id - partition id
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_partition_create(
rtems_name name,
void *starting_address,
unsigned32 length,
unsigned32 buffer_size,
rtems_attribute attribute_set,
Objects_Id *id
)
{
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
!_Partition_Is_buffer_size_aligned( buffer_size ) )
return RTEMS_INVALID_SIZE;
if ( !_Addresses_Is_aligned( starting_address ) )
return RTEMS_INVALID_ADDRESS;
#if defined(RTEMS_MULTIPROCESSING)
if ( _Attributes_Is_global( attribute_set ) &&
!_System_state_Is_multiprocessing )
return RTEMS_MP_NOT_CONFIGURED;
#endif
_Thread_Disable_dispatch(); /* prevents deletion */
the_partition = _Partition_Allocate();
if ( !the_partition ) {
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#if defined(RTEMS_MULTIPROCESSING)
if ( _Attributes_Is_global( attribute_set ) &&
!( _Objects_MP_Allocate_and_open( &_Partition_Information, name,
the_partition->Object.id, FALSE ) ) ) {
_Partition_Free( the_partition );
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#endif
the_partition->starting_address = starting_address;
the_partition->length = length;
the_partition->buffer_size = buffer_size;
the_partition->attribute_set = attribute_set;
the_partition->number_of_used_blocks = 0;
_Chain_Initialize( &the_partition->Memory, starting_address,
length / buffer_size, buffer_size );
_Objects_Open( &_Partition_Information, &the_partition->Object, &name );
*id = the_partition->Object.id;
#if defined(RTEMS_MULTIPROCESSING)
if ( _Attributes_Is_global( attribute_set ) )
_Partition_MP_Send_process_packet(
PARTITION_MP_ANNOUNCE_CREATE,
the_partition->Object.id,
name,
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}

View File

@@ -0,0 +1,88 @@
/*
* Partition Manager
*
*
* COPYRIGHT (c) 1989-1998.
* On-Line Applications Research Corporation (OAR).
* Copyright assigned to U.S. Government, 1994.
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id$
*/
#include <rtems/system.h>
#include <rtems/rtems/status.h>
#include <rtems/rtems/support.h>
#include <rtems/score/address.h>
#include <rtems/score/object.h>
#include <rtems/rtems/part.h>
#include <rtems/score/thread.h>
#include <rtems/score/sysstate.h>
/*PAGE
*
* rtems_partition_delete
*
* This directive allows a thread to delete a partition specified by
* the partition identifier, provided that none of its buffers are
* still allocated.
*
* Input parameters:
* id - partition id
*
* Output parameters:
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_partition_delete(
Objects_Id id
)
{
register Partition_Control *the_partition;
Objects_Locations location;
the_partition = _Partition_Get( id, &location );
switch ( location ) {
case OBJECTS_REMOTE:
#if defined(RTEMS_MULTIPROCESSING)
_Thread_Dispatch();
return RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
#endif
case OBJECTS_ERROR:
return RTEMS_INVALID_ID;
case OBJECTS_LOCAL:
if ( the_partition->number_of_used_blocks == 0 ) {
_Objects_Close( &_Partition_Information, &the_partition->Object );
_Partition_Free( the_partition );
#if defined(RTEMS_MULTIPROCESSING)
if ( _Attributes_Is_global( the_partition->attribute_set ) ) {
_Objects_MP_Close(
&_Partition_Information,
the_partition->Object.id
);
_Partition_MP_Send_process_packet(
PARTITION_MP_ANNOUNCE_DELETE,
the_partition->Object.id,
0, /* Not used */
0 /* Not used */
);
}
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
return RTEMS_RESOURCE_IN_USE;
}
return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}

View File

@@ -0,0 +1,80 @@
/*
* Partition Manager
*
*
* COPYRIGHT (c) 1989-1998.
* On-Line Applications Research Corporation (OAR).
* Copyright assigned to U.S. Government, 1994.
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id$
*/
#include <rtems/system.h>
#include <rtems/rtems/status.h>
#include <rtems/rtems/support.h>
#include <rtems/score/address.h>
#include <rtems/score/object.h>
#include <rtems/rtems/part.h>
#include <rtems/score/thread.h>
#include <rtems/score/sysstate.h>
/*PAGE
*
* rtems_partition_get_buffer
*
* This directive will obtain a buffer from a buffer partition.
*
* Input parameters:
* id - partition id
* buffer - pointer to buffer address
*
* Output parameters:
* buffer - pointer to buffer address filled in
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_partition_get_buffer(
Objects_Id id,
void **buffer
)
{
register Partition_Control *the_partition;
Objects_Locations location;
void *the_buffer;
the_partition = _Partition_Get( id, &location );
switch ( location ) {
case OBJECTS_REMOTE:
#if defined(RTEMS_MULTIPROCESSING)
_Thread_Executing->Wait.return_argument = buffer;
return(
_Partition_MP_Send_request_packet(
PARTITION_MP_GET_BUFFER_REQUEST,
id,
0 /* Not used */
)
);
#endif
case OBJECTS_ERROR:
return RTEMS_INVALID_ID;
case OBJECTS_LOCAL:
the_buffer = _Partition_Allocate_buffer( the_partition );
if ( the_buffer ) {
the_partition->number_of_used_blocks += 1;
_Thread_Enable_dispatch();
*buffer = the_buffer;
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
return RTEMS_UNSATISFIED;
}
return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}

View File

@@ -0,0 +1,54 @@
/*
* Partition Manager
*
*
* COPYRIGHT (c) 1989-1998.
* On-Line Applications Research Corporation (OAR).
* Copyright assigned to U.S. Government, 1994.
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id$
*/
#include <rtems/system.h>
#include <rtems/rtems/status.h>
#include <rtems/rtems/support.h>
#include <rtems/score/address.h>
#include <rtems/score/object.h>
#include <rtems/rtems/part.h>
#include <rtems/score/thread.h>
#include <rtems/score/sysstate.h>
/*PAGE
*
* rtems_partition_ident
*
* This directive returns the system ID associated with
* the partition name.
*
* Input parameters:
* name - user defined partition name
* node - node(s) to be searched
* id - pointer to partition id
*
* Output parameters:
* *id - partition id
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_partition_ident(
rtems_name name,
unsigned32 node,
Objects_Id *id
)
{
Objects_Name_to_id_errors status;
status = _Objects_Name_to_id( &_Partition_Information, &name, node, id );
return _Status_Object_name_errors_to_status[ status ];
}

View File

@@ -0,0 +1,76 @@
/*
* Partition Manager
*
*
* COPYRIGHT (c) 1989-1998.
* On-Line Applications Research Corporation (OAR).
* Copyright assigned to U.S. Government, 1994.
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id$
*/
#include <rtems/system.h>
#include <rtems/rtems/status.h>
#include <rtems/rtems/support.h>
#include <rtems/score/address.h>
#include <rtems/score/object.h>
#include <rtems/rtems/part.h>
#include <rtems/score/thread.h>
#include <rtems/score/sysstate.h>
/*PAGE
*
* rtems_partition_return_buffer
*
* This directive will return the given buffer to the specified
* buffer partition.
*
* Input parameters:
* id - partition id
* buffer - pointer to buffer address
*
* Output parameters:
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_partition_return_buffer(
Objects_Id id,
void *buffer
)
{
register Partition_Control *the_partition;
Objects_Locations location;
the_partition = _Partition_Get( id, &location );
switch ( location ) {
case OBJECTS_REMOTE:
#if defined(RTEMS_MULTIPROCESSING)
return _Partition_MP_Send_request_packet(
PARTITION_MP_RETURN_BUFFER_REQUEST,
id,
buffer
);
#endif
case OBJECTS_ERROR:
return RTEMS_INVALID_ID;
case OBJECTS_LOCAL:
if ( _Partition_Is_buffer_valid( buffer, the_partition ) ) {
_Partition_Free_buffer( the_partition, buffer );
the_partition->number_of_used_blocks -= 1;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
return RTEMS_INVALID_ADDRESS;
}
return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}

View File

@@ -62,302 +62,3 @@ void _Partition_Manager_initialization(
#endif #endif
} }
/*PAGE
*
* rtems_partition_create
*
* This directive creates a partiton of fixed sized buffers from the
* given contiguous memory area.
*
* Input parameters:
* name - user defined partition name
* starting_address - physical start address of partition
* length - physical length in bytes
* buffer_size - size of buffers in bytes
* attribute_set - partition attributes
* id - pointer to partition id
*
* Output parameters:
* id - partition id
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_partition_create(
rtems_name name,
void *starting_address,
unsigned32 length,
unsigned32 buffer_size,
rtems_attribute attribute_set,
Objects_Id *id
)
{
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
!_Partition_Is_buffer_size_aligned( buffer_size ) )
return RTEMS_INVALID_SIZE;
if ( !_Addresses_Is_aligned( starting_address ) )
return RTEMS_INVALID_ADDRESS;
#if defined(RTEMS_MULTIPROCESSING)
if ( _Attributes_Is_global( attribute_set ) &&
!_System_state_Is_multiprocessing )
return RTEMS_MP_NOT_CONFIGURED;
#endif
_Thread_Disable_dispatch(); /* prevents deletion */
the_partition = _Partition_Allocate();
if ( !the_partition ) {
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#if defined(RTEMS_MULTIPROCESSING)
if ( _Attributes_Is_global( attribute_set ) &&
!( _Objects_MP_Allocate_and_open( &_Partition_Information, name,
the_partition->Object.id, FALSE ) ) ) {
_Partition_Free( the_partition );
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#endif
the_partition->starting_address = starting_address;
the_partition->length = length;
the_partition->buffer_size = buffer_size;
the_partition->attribute_set = attribute_set;
the_partition->number_of_used_blocks = 0;
_Chain_Initialize( &the_partition->Memory, starting_address,
length / buffer_size, buffer_size );
_Objects_Open( &_Partition_Information, &the_partition->Object, &name );
*id = the_partition->Object.id;
#if defined(RTEMS_MULTIPROCESSING)
if ( _Attributes_Is_global( attribute_set ) )
_Partition_MP_Send_process_packet(
PARTITION_MP_ANNOUNCE_CREATE,
the_partition->Object.id,
name,
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
/*PAGE
*
* rtems_partition_ident
*
* This directive returns the system ID associated with
* the partition name.
*
* Input parameters:
* name - user defined partition name
* node - node(s) to be searched
* id - pointer to partition id
*
* Output parameters:
* *id - partition id
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_partition_ident(
rtems_name name,
unsigned32 node,
Objects_Id *id
)
{
Objects_Name_to_id_errors status;
status = _Objects_Name_to_id( &_Partition_Information, &name, node, id );
return _Status_Object_name_errors_to_status[ status ];
}
/*PAGE
*
* rtems_partition_delete
*
* This directive allows a thread to delete a partition specified by
* the partition identifier, provided that none of its buffers are
* still allocated.
*
* Input parameters:
* id - partition id
*
* Output parameters:
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_partition_delete(
Objects_Id id
)
{
register Partition_Control *the_partition;
Objects_Locations location;
the_partition = _Partition_Get( id, &location );
switch ( location ) {
case OBJECTS_REMOTE:
#if defined(RTEMS_MULTIPROCESSING)
_Thread_Dispatch();
return RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
#endif
case OBJECTS_ERROR:
return RTEMS_INVALID_ID;
case OBJECTS_LOCAL:
if ( the_partition->number_of_used_blocks == 0 ) {
_Objects_Close( &_Partition_Information, &the_partition->Object );
_Partition_Free( the_partition );
#if defined(RTEMS_MULTIPROCESSING)
if ( _Attributes_Is_global( the_partition->attribute_set ) ) {
_Objects_MP_Close(
&_Partition_Information,
the_partition->Object.id
);
_Partition_MP_Send_process_packet(
PARTITION_MP_ANNOUNCE_DELETE,
the_partition->Object.id,
0, /* Not used */
0 /* Not used */
);
}
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
return RTEMS_RESOURCE_IN_USE;
}
return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
*
* rtems_partition_get_buffer
*
* This directive will obtain a buffer from a buffer partition.
*
* Input parameters:
* id - partition id
* buffer - pointer to buffer address
*
* Output parameters:
* buffer - pointer to buffer address filled in
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_partition_get_buffer(
Objects_Id id,
void **buffer
)
{
register Partition_Control *the_partition;
Objects_Locations location;
void *the_buffer;
the_partition = _Partition_Get( id, &location );
switch ( location ) {
case OBJECTS_REMOTE:
#if defined(RTEMS_MULTIPROCESSING)
_Thread_Executing->Wait.return_argument = buffer;
return(
_Partition_MP_Send_request_packet(
PARTITION_MP_GET_BUFFER_REQUEST,
id,
0 /* Not used */
)
);
#endif
case OBJECTS_ERROR:
return RTEMS_INVALID_ID;
case OBJECTS_LOCAL:
the_buffer = _Partition_Allocate_buffer( the_partition );
if ( the_buffer ) {
the_partition->number_of_used_blocks += 1;
_Thread_Enable_dispatch();
*buffer = the_buffer;
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
return RTEMS_UNSATISFIED;
}
return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}
/*PAGE
*
* rtems_partition_return_buffer
*
* This directive will return the given buffer to the specified
* buffer partition.
*
* Input parameters:
* id - partition id
* buffer - pointer to buffer address
*
* Output parameters:
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_partition_return_buffer(
Objects_Id id,
void *buffer
)
{
register Partition_Control *the_partition;
Objects_Locations location;
the_partition = _Partition_Get( id, &location );
switch ( location ) {
case OBJECTS_REMOTE:
#if defined(RTEMS_MULTIPROCESSING)
return _Partition_MP_Send_request_packet(
PARTITION_MP_RETURN_BUFFER_REQUEST,
id,
buffer
);
#endif
case OBJECTS_ERROR:
return RTEMS_INVALID_ID;
case OBJECTS_LOCAL:
if ( _Partition_Is_buffer_valid( buffer, the_partition ) ) {
_Partition_Free_buffer( the_partition, buffer );
the_partition->number_of_used_blocks -= 1;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
return RTEMS_INVALID_ADDRESS;
}
return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}

View File

@@ -0,0 +1,116 @@
/*
* Partition Manager
*
*
* COPYRIGHT (c) 1989-1998.
* On-Line Applications Research Corporation (OAR).
* Copyright assigned to U.S. Government, 1994.
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id$
*/
#include <rtems/system.h>
#include <rtems/rtems/status.h>
#include <rtems/rtems/support.h>
#include <rtems/score/address.h>
#include <rtems/score/object.h>
#include <rtems/rtems/part.h>
#include <rtems/score/thread.h>
#include <rtems/score/sysstate.h>
/*PAGE
*
* rtems_partition_create
*
* This directive creates a partiton of fixed sized buffers from the
* given contiguous memory area.
*
* Input parameters:
* name - user defined partition name
* starting_address - physical start address of partition
* length - physical length in bytes
* buffer_size - size of buffers in bytes
* attribute_set - partition attributes
* id - pointer to partition id
*
* Output parameters:
* id - partition id
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_partition_create(
rtems_name name,
void *starting_address,
unsigned32 length,
unsigned32 buffer_size,
rtems_attribute attribute_set,
Objects_Id *id
)
{
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
!_Partition_Is_buffer_size_aligned( buffer_size ) )
return RTEMS_INVALID_SIZE;
if ( !_Addresses_Is_aligned( starting_address ) )
return RTEMS_INVALID_ADDRESS;
#if defined(RTEMS_MULTIPROCESSING)
if ( _Attributes_Is_global( attribute_set ) &&
!_System_state_Is_multiprocessing )
return RTEMS_MP_NOT_CONFIGURED;
#endif
_Thread_Disable_dispatch(); /* prevents deletion */
the_partition = _Partition_Allocate();
if ( !the_partition ) {
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#if defined(RTEMS_MULTIPROCESSING)
if ( _Attributes_Is_global( attribute_set ) &&
!( _Objects_MP_Allocate_and_open( &_Partition_Information, name,
the_partition->Object.id, FALSE ) ) ) {
_Partition_Free( the_partition );
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#endif
the_partition->starting_address = starting_address;
the_partition->length = length;
the_partition->buffer_size = buffer_size;
the_partition->attribute_set = attribute_set;
the_partition->number_of_used_blocks = 0;
_Chain_Initialize( &the_partition->Memory, starting_address,
length / buffer_size, buffer_size );
_Objects_Open( &_Partition_Information, &the_partition->Object, &name );
*id = the_partition->Object.id;
#if defined(RTEMS_MULTIPROCESSING)
if ( _Attributes_Is_global( attribute_set ) )
_Partition_MP_Send_process_packet(
PARTITION_MP_ANNOUNCE_CREATE,
the_partition->Object.id,
name,
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}

View File

@@ -0,0 +1,88 @@
/*
* Partition Manager
*
*
* COPYRIGHT (c) 1989-1998.
* On-Line Applications Research Corporation (OAR).
* Copyright assigned to U.S. Government, 1994.
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id$
*/
#include <rtems/system.h>
#include <rtems/rtems/status.h>
#include <rtems/rtems/support.h>
#include <rtems/score/address.h>
#include <rtems/score/object.h>
#include <rtems/rtems/part.h>
#include <rtems/score/thread.h>
#include <rtems/score/sysstate.h>
/*PAGE
*
* rtems_partition_delete
*
* This directive allows a thread to delete a partition specified by
* the partition identifier, provided that none of its buffers are
* still allocated.
*
* Input parameters:
* id - partition id
*
* Output parameters:
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_partition_delete(
Objects_Id id
)
{
register Partition_Control *the_partition;
Objects_Locations location;
the_partition = _Partition_Get( id, &location );
switch ( location ) {
case OBJECTS_REMOTE:
#if defined(RTEMS_MULTIPROCESSING)
_Thread_Dispatch();
return RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
#endif
case OBJECTS_ERROR:
return RTEMS_INVALID_ID;
case OBJECTS_LOCAL:
if ( the_partition->number_of_used_blocks == 0 ) {
_Objects_Close( &_Partition_Information, &the_partition->Object );
_Partition_Free( the_partition );
#if defined(RTEMS_MULTIPROCESSING)
if ( _Attributes_Is_global( the_partition->attribute_set ) ) {
_Objects_MP_Close(
&_Partition_Information,
the_partition->Object.id
);
_Partition_MP_Send_process_packet(
PARTITION_MP_ANNOUNCE_DELETE,
the_partition->Object.id,
0, /* Not used */
0 /* Not used */
);
}
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
return RTEMS_RESOURCE_IN_USE;
}
return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}

View File

@@ -0,0 +1,80 @@
/*
* Partition Manager
*
*
* COPYRIGHT (c) 1989-1998.
* On-Line Applications Research Corporation (OAR).
* Copyright assigned to U.S. Government, 1994.
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id$
*/
#include <rtems/system.h>
#include <rtems/rtems/status.h>
#include <rtems/rtems/support.h>
#include <rtems/score/address.h>
#include <rtems/score/object.h>
#include <rtems/rtems/part.h>
#include <rtems/score/thread.h>
#include <rtems/score/sysstate.h>
/*PAGE
*
* rtems_partition_get_buffer
*
* This directive will obtain a buffer from a buffer partition.
*
* Input parameters:
* id - partition id
* buffer - pointer to buffer address
*
* Output parameters:
* buffer - pointer to buffer address filled in
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_partition_get_buffer(
Objects_Id id,
void **buffer
)
{
register Partition_Control *the_partition;
Objects_Locations location;
void *the_buffer;
the_partition = _Partition_Get( id, &location );
switch ( location ) {
case OBJECTS_REMOTE:
#if defined(RTEMS_MULTIPROCESSING)
_Thread_Executing->Wait.return_argument = buffer;
return(
_Partition_MP_Send_request_packet(
PARTITION_MP_GET_BUFFER_REQUEST,
id,
0 /* Not used */
)
);
#endif
case OBJECTS_ERROR:
return RTEMS_INVALID_ID;
case OBJECTS_LOCAL:
the_buffer = _Partition_Allocate_buffer( the_partition );
if ( the_buffer ) {
the_partition->number_of_used_blocks += 1;
_Thread_Enable_dispatch();
*buffer = the_buffer;
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
return RTEMS_UNSATISFIED;
}
return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}

View File

@@ -0,0 +1,54 @@
/*
* Partition Manager
*
*
* COPYRIGHT (c) 1989-1998.
* On-Line Applications Research Corporation (OAR).
* Copyright assigned to U.S. Government, 1994.
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id$
*/
#include <rtems/system.h>
#include <rtems/rtems/status.h>
#include <rtems/rtems/support.h>
#include <rtems/score/address.h>
#include <rtems/score/object.h>
#include <rtems/rtems/part.h>
#include <rtems/score/thread.h>
#include <rtems/score/sysstate.h>
/*PAGE
*
* rtems_partition_ident
*
* This directive returns the system ID associated with
* the partition name.
*
* Input parameters:
* name - user defined partition name
* node - node(s) to be searched
* id - pointer to partition id
*
* Output parameters:
* *id - partition id
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_partition_ident(
rtems_name name,
unsigned32 node,
Objects_Id *id
)
{
Objects_Name_to_id_errors status;
status = _Objects_Name_to_id( &_Partition_Information, &name, node, id );
return _Status_Object_name_errors_to_status[ status ];
}

View File

@@ -0,0 +1,76 @@
/*
* Partition Manager
*
*
* COPYRIGHT (c) 1989-1998.
* On-Line Applications Research Corporation (OAR).
* Copyright assigned to U.S. Government, 1994.
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id$
*/
#include <rtems/system.h>
#include <rtems/rtems/status.h>
#include <rtems/rtems/support.h>
#include <rtems/score/address.h>
#include <rtems/score/object.h>
#include <rtems/rtems/part.h>
#include <rtems/score/thread.h>
#include <rtems/score/sysstate.h>
/*PAGE
*
* rtems_partition_return_buffer
*
* This directive will return the given buffer to the specified
* buffer partition.
*
* Input parameters:
* id - partition id
* buffer - pointer to buffer address
*
* Output parameters:
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_partition_return_buffer(
Objects_Id id,
void *buffer
)
{
register Partition_Control *the_partition;
Objects_Locations location;
the_partition = _Partition_Get( id, &location );
switch ( location ) {
case OBJECTS_REMOTE:
#if defined(RTEMS_MULTIPROCESSING)
return _Partition_MP_Send_request_packet(
PARTITION_MP_RETURN_BUFFER_REQUEST,
id,
buffer
);
#endif
case OBJECTS_ERROR:
return RTEMS_INVALID_ID;
case OBJECTS_LOCAL:
if ( _Partition_Is_buffer_valid( buffer, the_partition ) ) {
_Partition_Free_buffer( the_partition, buffer );
the_partition->number_of_used_blocks -= 1;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
return RTEMS_INVALID_ADDRESS;
}
return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
}