forked from Imagelibrary/rtems
Split Partition Manager into one routine per file.
This commit is contained in:
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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 */
|
|
||||||
}
|
|
||||||
|
|||||||
116
c/src/exec/rtems/src/partcreate.c
Normal file
116
c/src/exec/rtems/src/partcreate.c
Normal 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;
|
||||||
|
}
|
||||||
88
c/src/exec/rtems/src/partdelete.c
Normal file
88
c/src/exec/rtems/src/partdelete.c
Normal 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 */
|
||||||
|
}
|
||||||
80
c/src/exec/rtems/src/partgetbuffer.c
Normal file
80
c/src/exec/rtems/src/partgetbuffer.c
Normal 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 */
|
||||||
|
}
|
||||||
54
c/src/exec/rtems/src/partident.c
Normal file
54
c/src/exec/rtems/src/partident.c
Normal 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 ];
|
||||||
|
}
|
||||||
76
c/src/exec/rtems/src/partreturnbuffer.c
Normal file
76
c/src/exec/rtems/src/partreturnbuffer.c
Normal 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 */
|
||||||
|
}
|
||||||
@@ -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 */
|
|
||||||
}
|
|
||||||
|
|||||||
116
cpukit/rtems/src/partcreate.c
Normal file
116
cpukit/rtems/src/partcreate.c
Normal 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;
|
||||||
|
}
|
||||||
88
cpukit/rtems/src/partdelete.c
Normal file
88
cpukit/rtems/src/partdelete.c
Normal 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 */
|
||||||
|
}
|
||||||
80
cpukit/rtems/src/partgetbuffer.c
Normal file
80
cpukit/rtems/src/partgetbuffer.c
Normal 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 */
|
||||||
|
}
|
||||||
54
cpukit/rtems/src/partident.c
Normal file
54
cpukit/rtems/src/partident.c
Normal 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 ];
|
||||||
|
}
|
||||||
76
cpukit/rtems/src/partreturnbuffer.c
Normal file
76
cpukit/rtems/src/partreturnbuffer.c
Normal 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 */
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user