summaryrefslogtreecommitdiffstats
path: root/c
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2002-07-01 22:32:31 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2002-07-01 22:32:31 +0000
commit90015e7f864274881572362aa19530b608e5b540 (patch)
tree18898ad469cb28aeccefd93b79d7452767df0d59 /c
parent2002-07-01 Joel Sherrill <joel@OARcorp.com> (diff)
downloadrtems-90015e7f864274881572362aa19530b608e5b540.tar.bz2
2002-07-01 Joel Sherrill <joel@OARcorp.com>
* 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.
Diffstat (limited to 'c')
-rw-r--r--c/src/exec/rtems/ChangeLog28
-rw-r--r--c/src/exec/rtems/include/rtems.h2
-rw-r--r--c/src/exec/rtems/inline/rtems/rtems/region.inl2
-rw-r--r--c/src/exec/rtems/macros/rtems/rtems/region.inl2
-rw-r--r--c/src/exec/rtems/src/dpmem.c19
-rw-r--r--c/src/exec/rtems/src/dpmemcreate.c2
-rw-r--r--c/src/exec/rtems/src/msg.c19
-rw-r--r--c/src/exec/rtems/src/msgqcreate.c13
-rw-r--r--c/src/exec/rtems/src/part.c20
-rw-r--r--c/src/exec/rtems/src/partcreate.c2
-rw-r--r--c/src/exec/rtems/src/ratemon.c20
-rw-r--r--c/src/exec/rtems/src/ratemoncreate.c2
-rw-r--r--c/src/exec/rtems/src/region.c25
-rw-r--r--c/src/exec/rtems/src/regioncreate.c17
-rw-r--r--c/src/exec/rtems/src/regiondelete.c8
-rw-r--r--c/src/exec/rtems/src/regionextend.c6
-rw-r--r--c/src/exec/rtems/src/regiongetinfo.c8
-rw-r--r--c/src/exec/rtems/src/regiongetsegment.c12
-rw-r--r--c/src/exec/rtems/src/regiongetsegmentsize.c8
-rw-r--r--c/src/exec/rtems/src/regionident.c1
-rw-r--r--c/src/exec/rtems/src/regionreturnsegment.c10
-rw-r--r--c/src/exec/rtems/src/rtemstimer.c20
-rw-r--r--c/src/exec/rtems/src/sem.c20
-rw-r--r--c/src/exec/rtems/src/semcreate.c18
-rw-r--r--c/src/exec/rtems/src/taskcreate.c2
-rw-r--r--c/src/exec/rtems/src/taskident.c2
-rw-r--r--c/src/exec/rtems/src/tasks.c20
-rw-r--r--c/src/exec/rtems/src/timercreate.c2
28 files changed, 189 insertions, 121 deletions
diff --git a/c/src/exec/rtems/ChangeLog b/c/src/exec/rtems/ChangeLog
index a3e6d0729a..5073d3d127 100644
--- a/c/src/exec/rtems/ChangeLog
+++ b/c/src/exec/rtems/ChangeLog
@@ -1,3 +1,31 @@
+2002-07-01 Joel Sherrill <joel@OARcorp.com>
+
+ * 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.
+
2001-04-08 Joel Sherrill <joel@OARcorp.com>
* src/tasks.c: Pre-initialized switch extension for list.
diff --git a/c/src/exec/rtems/include/rtems.h b/c/src/exec/rtems/include/rtems.h
index 99457be2f0..0ca040e9e4 100644
--- a/c/src/exec/rtems/include/rtems.h
+++ b/c/src/exec/rtems/include/rtems.h
@@ -82,8 +82,8 @@ extern "C" {
#define RTEMS_OBJECT_ID_INITIAL_INDEX OBJECTS_ID_INITIAL_INDEX
#define RTEMS_OBJECT_ID_FINAL_INDEX OBJECTS_ID_FINAL_INDEX
+#define RTEMS_OBJECT_ID_INITIAL(api, class, node) OBJECTS_ID_INITIAL(api, class, node)
-#define RTEMS_OBJECT_ID_INITIAL(class, node) OBJECTS_ID_INITIAL(class, node)
#define RTEMS_OBJECT_ID_FINAL OBJECTS_ID_FINAL
/*
diff --git a/c/src/exec/rtems/inline/rtems/rtems/region.inl b/c/src/exec/rtems/inline/rtems/rtems/region.inl
index 1f2b8f766c..d61afaee3f 100644
--- a/c/src/exec/rtems/inline/rtems/rtems/region.inl
+++ b/c/src/exec/rtems/inline/rtems/rtems/region.inl
@@ -67,7 +67,7 @@ RTEMS_INLINE_ROUTINE Region_Control *_Region_Get (
)
{
return (Region_Control *)
- _Objects_Get( &_Region_Information, id, location );
+ _Objects_Get_no_protection( &_Region_Information, id, location );
}
/*PAGE
diff --git a/c/src/exec/rtems/macros/rtems/rtems/region.inl b/c/src/exec/rtems/macros/rtems/rtems/region.inl
index 2576a08bec..02e95fdea2 100644
--- a/c/src/exec/rtems/macros/rtems/rtems/region.inl
+++ b/c/src/exec/rtems/macros/rtems/rtems/region.inl
@@ -42,7 +42,7 @@
#define _Region_Get( _id, _location ) \
(Region_Control *) \
- _Objects_Get( &_Region_Information, (_id), (_location) )
+ _Objects_Get_no_protection( &_Region_Information, (_id), (_location) )
/*PAGE
*
diff --git a/c/src/exec/rtems/src/dpmem.c b/c/src/exec/rtems/src/dpmem.c
index 38ca108a1a..9a3b663260 100644
--- a/c/src/exec/rtems/src/dpmem.c
+++ b/c/src/exec/rtems/src/dpmem.c
@@ -38,13 +38,18 @@ void _Dual_ported_memory_Manager_initialization(
)
{
_Objects_Initialize_information(
- &_Dual_ported_memory_Information,
- OBJECTS_RTEMS_PORTS,
- FALSE,
- maximum_ports,
+ &_Dual_ported_memory_Information, /* object information table */
+ OBJECTS_CLASSIC_API, /* object API */
+ OBJECTS_RTEMS_PORTS, /* object class */
+ maximum_ports, /* maximum objects of this class */
sizeof( Dual_ported_memory_Control ),
- FALSE,
- RTEMS_MAXIMUM_NAME_LENGTH,
- FALSE
+ /* size of this object's control block */
+ FALSE, /* TRUE if names of this object are strings */
+ RTEMS_MAXIMUM_NAME_LENGTH /* maximum length of each object's name */
+#if defined(RTEMS_MULTIPROCESSING)
+ ,
+ FALSE, /* TRUE if this is a global object class */
+ NULL /* Proxy extraction support callout */
+#endif
);
}
diff --git a/c/src/exec/rtems/src/dpmemcreate.c b/c/src/exec/rtems/src/dpmemcreate.c
index 8d4bdbdb10..951391d8b6 100644
--- a/c/src/exec/rtems/src/dpmemcreate.c
+++ b/c/src/exec/rtems/src/dpmemcreate.c
@@ -72,7 +72,7 @@ rtems_status_code rtems_port_create(
_Objects_Open(
&_Dual_ported_memory_Information,
&the_port->Object,
- &name
+ name
);
*id = the_port->Object.id;
diff --git a/c/src/exec/rtems/src/msg.c b/c/src/exec/rtems/src/msg.c
index 4e68b175b3..62529b6dd2 100644
--- a/c/src/exec/rtems/src/msg.c
+++ b/c/src/exec/rtems/src/msg.c
@@ -48,14 +48,19 @@ void _Message_queue_Manager_initialization(
)
{
_Objects_Initialize_information(
- &_Message_queue_Information,
- OBJECTS_RTEMS_MESSAGE_QUEUES,
- TRUE,
- maximum_message_queues,
+ &_Message_queue_Information, /* object information table */
+ OBJECTS_CLASSIC_API, /* object API */
+ OBJECTS_RTEMS_MESSAGE_QUEUES, /* object class */
+ maximum_message_queues, /* maximum objects of this class */
sizeof( Message_queue_Control ),
- FALSE,
- RTEMS_MAXIMUM_NAME_LENGTH,
- FALSE
+ /* size of this object's control block */
+ FALSE, /* TRUE if names of this object are strings */
+ RTEMS_MAXIMUM_NAME_LENGTH /* maximum length of each object's name */
+#if defined(RTEMS_MULTIPROCESSING)
+ ,
+ FALSE, /* TRUE if this is a global object class */
+ NULL /* Proxy extraction support callout */
+#endif
);
/*
diff --git a/c/src/exec/rtems/src/msgqcreate.c b/c/src/exec/rtems/src/msgqcreate.c
index 24bc35993d..537704360b 100644
--- a/c/src/exec/rtems/src/msgqcreate.c
+++ b/c/src/exec/rtems/src/msgqcreate.c
@@ -60,7 +60,6 @@ rtems_status_code rtems_message_queue_create(
{
register Message_queue_Control *the_message_queue;
CORE_message_queue_Attributes the_msgq_attributes;
- void *handler;
#if defined(RTEMS_MULTIPROCESSING)
boolean is_global;
#endif
@@ -119,18 +118,12 @@ rtems_status_code rtems_message_queue_create(
else
the_msgq_attributes.discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO;
- handler = NULL;
-#if defined(RTEMS_MULTIPROCESSING)
- handler = _Message_queue_MP_Send_extract_proxy;
-#endif
-
if ( ! _CORE_message_queue_Initialize(
&the_message_queue->message_queue,
- OBJECTS_RTEMS_MESSAGE_QUEUES,
&the_msgq_attributes,
count,
- max_message_size,
- handler ) ) {
+ max_message_size
+ ) ) {
#if defined(RTEMS_MULTIPROCESSING)
if ( is_global )
_Objects_MP_Close(
@@ -145,7 +138,7 @@ rtems_status_code rtems_message_queue_create(
_Objects_Open(
&_Message_queue_Information,
&the_message_queue->Object,
- &name
+ name
);
*id = the_message_queue->Object.id;
diff --git a/c/src/exec/rtems/src/part.c b/c/src/exec/rtems/src/part.c
index 7e13628450..add2a77f9f 100644
--- a/c/src/exec/rtems/src/part.c
+++ b/c/src/exec/rtems/src/part.c
@@ -39,14 +39,18 @@ void _Partition_Manager_initialization(
)
{
_Objects_Initialize_information(
- &_Partition_Information,
- OBJECTS_RTEMS_PARTITIONS,
- TRUE,
- maximum_partitions,
- sizeof( Partition_Control ),
- FALSE,
- RTEMS_MAXIMUM_NAME_LENGTH,
- FALSE
+ &_Partition_Information, /* object information table */
+ OBJECTS_CLASSIC_API, /* object API */
+ OBJECTS_RTEMS_PARTITIONS, /* object class */
+ maximum_partitions, /* maximum objects of this class */
+ sizeof( Partition_Control ), /* size of this object's control block */
+ FALSE, /* TRUE if the name is a string */
+ RTEMS_MAXIMUM_NAME_LENGTH /* maximum length of an object name */
+#if defined(RTEMS_MULTIPROCESSING)
+ ,
+ FALSE, /* TRUE if this is a global object class */
+ NULL /* Proxy extraction support callout */
+#endif
);
/*
diff --git a/c/src/exec/rtems/src/partcreate.c b/c/src/exec/rtems/src/partcreate.c
index 70b0585df7..ffd398b3e1 100644
--- a/c/src/exec/rtems/src/partcreate.c
+++ b/c/src/exec/rtems/src/partcreate.c
@@ -97,7 +97,7 @@ rtems_status_code rtems_partition_create(
_Chain_Initialize( &the_partition->Memory, starting_address,
length / buffer_size, buffer_size );
- _Objects_Open( &_Partition_Information, &the_partition->Object, &name );
+ _Objects_Open( &_Partition_Information, &the_partition->Object, name );
*id = the_partition->Object.id;
#if defined(RTEMS_MULTIPROCESSING)
diff --git a/c/src/exec/rtems/src/ratemon.c b/c/src/exec/rtems/src/ratemon.c
index 29ded58b6a..979787afa3 100644
--- a/c/src/exec/rtems/src/ratemon.c
+++ b/c/src/exec/rtems/src/ratemon.c
@@ -41,13 +41,17 @@ void _Rate_monotonic_Manager_initialization(
)
{
_Objects_Initialize_information(
- &_Rate_monotonic_Information,
- OBJECTS_RTEMS_PERIODS,
- FALSE,
- maximum_periods,
- sizeof( Rate_monotonic_Control ),
- FALSE,
- RTEMS_MAXIMUM_NAME_LENGTH,
- FALSE
+ &_Rate_monotonic_Information, /* object information table */
+ OBJECTS_CLASSIC_API, /* object API */
+ OBJECTS_RTEMS_PERIODS, /* object class */
+ maximum_periods, /* maximum objects of this class */
+ sizeof( Rate_monotonic_Control ), /* size of this object's control block */
+ FALSE, /* TRUE if the name is a string */
+ RTEMS_MAXIMUM_NAME_LENGTH /* maximum length of an object name */
+#if defined(RTEMS_MULTIPROCESSING)
+ ,
+ FALSE, /* TRUE if this is a global object class */
+ NULL /* Proxy extraction support callout */
+#endif
);
}
diff --git a/c/src/exec/rtems/src/ratemoncreate.c b/c/src/exec/rtems/src/ratemoncreate.c
index 1fb4a9d466..a27fa2ee7a 100644
--- a/c/src/exec/rtems/src/ratemoncreate.c
+++ b/c/src/exec/rtems/src/ratemoncreate.c
@@ -59,7 +59,7 @@ rtems_status_code rtems_rate_monotonic_create(
the_period->owner = _Thread_Executing;
the_period->state = RATE_MONOTONIC_INACTIVE;
- _Objects_Open( &_Rate_monotonic_Information, &the_period->Object, &name );
+ _Objects_Open( &_Rate_monotonic_Information, &the_period->Object, name );
*id = the_period->Object.id;
_Thread_Enable_dispatch();
diff --git a/c/src/exec/rtems/src/region.c b/c/src/exec/rtems/src/region.c
index b00ba8bf52..ee627e65a4 100644
--- a/c/src/exec/rtems/src/region.c
+++ b/c/src/exec/rtems/src/region.c
@@ -20,6 +20,7 @@
#include <rtems/rtems/region.h>
#include <rtems/score/states.h>
#include <rtems/score/thread.h>
+#include <rtems/score/apimutex.h>
/*PAGE
*
@@ -37,15 +38,23 @@ void _Region_Manager_initialization(
unsigned32 maximum_regions
)
{
+ /* XXX move me */
+ _API_Mutex_Initialization( 1 );
+ _API_Mutex_Allocate( _RTEMS_Allocator_Mutex );
+
_Objects_Initialize_information(
- &_Region_Information,
- OBJECTS_RTEMS_REGIONS,
- FALSE,
- maximum_regions,
- sizeof( Region_Control ),
- FALSE,
- RTEMS_MAXIMUM_NAME_LENGTH,
- FALSE
+ &_Region_Information, /* object information table */
+ OBJECTS_CLASSIC_API, /* object API */
+ OBJECTS_RTEMS_REGIONS, /* object class */
+ maximum_regions, /* maximum objects of this class */
+ sizeof( Region_Control ), /* size of this object's control block */
+ FALSE, /* TRUE if the name is a string */
+ RTEMS_MAXIMUM_NAME_LENGTH /* maximum length of an object name */
+#if defined(RTEMS_MULTIPROCESSING)
+ ,
+ FALSE, /* TRUE if this is a global object class */
+ NULL /* Proxy extraction support callout */
+#endif
);
/*
diff --git a/c/src/exec/rtems/src/regioncreate.c b/c/src/exec/rtems/src/regioncreate.c
index cacef3fe0b..1bb8620a88 100644
--- a/c/src/exec/rtems/src/regioncreate.c
+++ b/c/src/exec/rtems/src/regioncreate.c
@@ -20,6 +20,7 @@
#include <rtems/rtems/region.h>
#include <rtems/score/states.h>
#include <rtems/score/thread.h>
+#include <rtems/score/apimutex.h>
/*PAGE
*
@@ -59,12 +60,12 @@ rtems_status_code rtems_region_create(
if ( !_Addresses_Is_aligned( starting_address ) )
return RTEMS_INVALID_ADDRESS;
- _Thread_Disable_dispatch(); /* to prevent deletion */
+ _RTEMS_Lock_allocator(); /* to prevent deletion */
the_region = _Region_Allocate();
if ( !the_region ) {
- _Thread_Enable_dispatch();
+ _RTEMS_Unlock_allocator();
return RTEMS_TOO_MANY;
}
@@ -73,7 +74,7 @@ rtems_status_code rtems_region_create(
if ( !the_region->maximum_segment_size ) {
_Region_Free( the_region );
- _Thread_Enable_dispatch();
+ _RTEMS_Unlock_allocator();
return RTEMS_INVALID_SIZE;
}
@@ -85,21 +86,15 @@ rtems_status_code rtems_region_create(
_Thread_queue_Initialize(
&the_region->Wait_queue,
- OBJECTS_RTEMS_REGIONS,
_Attributes_Is_priority( attribute_set ) ?
THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO,
STATES_WAITING_FOR_SEGMENT,
-#if defined(RTEMS_MULTIPROCESSING)
- _Region_MP_Send_extract_proxy,
-#else
- NULL,
-#endif
RTEMS_TIMEOUT
);
- _Objects_Open( &_Region_Information, &the_region->Object, &name );
+ _Objects_Open( &_Region_Information, &the_region->Object, name );
*id = the_region->Object.id;
- _Thread_Enable_dispatch();
+ _RTEMS_Unlock_allocator();
return RTEMS_SUCCESSFUL;
}
diff --git a/c/src/exec/rtems/src/regiondelete.c b/c/src/exec/rtems/src/regiondelete.c
index 669923c2e7..9b7c297d7a 100644
--- a/c/src/exec/rtems/src/regiondelete.c
+++ b/c/src/exec/rtems/src/regiondelete.c
@@ -20,6 +20,7 @@
#include <rtems/rtems/region.h>
#include <rtems/score/states.h>
#include <rtems/score/thread.h>
+#include <rtems/score/apimutex.h>
/*PAGE
*
@@ -44,12 +45,15 @@ rtems_status_code rtems_region_delete(
register Region_Control *the_region;
Objects_Locations location;
+ _RTEMS_Lock_allocator();
the_region = _Region_Get( id, &location );
switch ( location ) {
case OBJECTS_REMOTE: /* this error cannot be returned */
+ _RTEMS_Unlock_allocator();
return RTEMS_INTERNAL_ERROR;
case OBJECTS_ERROR:
+ _RTEMS_Unlock_allocator();
return RTEMS_INVALID_ID;
case OBJECTS_LOCAL:
@@ -57,10 +61,10 @@ rtems_status_code rtems_region_delete(
if ( the_region->number_of_used_blocks == 0 ) {
_Objects_Close( &_Region_Information, &the_region->Object );
_Region_Free( the_region );
- _Thread_Enable_dispatch();
+ _RTEMS_Unlock_allocator();
return RTEMS_SUCCESSFUL;
}
- _Thread_Enable_dispatch();
+ _RTEMS_Unlock_allocator();
return RTEMS_RESOURCE_IN_USE;
}
diff --git a/c/src/exec/rtems/src/regionextend.c b/c/src/exec/rtems/src/regionextend.c
index 0bbfac73b4..c36969beda 100644
--- a/c/src/exec/rtems/src/regionextend.c
+++ b/c/src/exec/rtems/src/regionextend.c
@@ -20,6 +20,7 @@
#include <rtems/rtems/region.h>
#include <rtems/score/states.h>
#include <rtems/score/thread.h>
+#include <rtems/score/apimutex.h>
/*PAGE
*
@@ -52,12 +53,15 @@ rtems_status_code rtems_region_extend(
status = RTEMS_SUCCESSFUL;
+ _RTEMS_Lock_allocator(); /* to prevent deletion */
the_region = _Region_Get( id, &location );
switch ( location ) {
case OBJECTS_REMOTE: /* this error cannot be returned */
+ _RTEMS_Unlock_allocator();
return RTEMS_INTERNAL_ERROR;
case OBJECTS_ERROR:
+ _RTEMS_Unlock_allocator();
return RTEMS_INVALID_ID;
case OBJECTS_LOCAL:
@@ -81,7 +85,7 @@ rtems_status_code rtems_region_extend(
status = RTEMS_NOT_IMPLEMENTED;
break;
}
- _Thread_Enable_dispatch();
+ _RTEMS_Unlock_allocator();
return( status );
}
diff --git a/c/src/exec/rtems/src/regiongetinfo.c b/c/src/exec/rtems/src/regiongetinfo.c
index 1e9338e3cd..2f7f21b72a 100644
--- a/c/src/exec/rtems/src/regiongetinfo.c
+++ b/c/src/exec/rtems/src/regiongetinfo.c
@@ -19,6 +19,7 @@
#include <rtems/rtems/options.h>
#include <rtems/rtems/region.h>
#include <rtems/score/states.h>
+#include <rtems/score/apimutex.h>
#include <rtems/score/thread.h>
/*PAGE
@@ -48,21 +49,24 @@ rtems_status_code rtems_region_get_information(
if ( !the_info )
return RTEMS_INVALID_ADDRESS;
+ _RTEMS_Lock_allocator();
the_region = _Region_Get( id, &location );
switch ( location ) {
case OBJECTS_REMOTE: /* this error cannot be returned */
+ _RTEMS_Unlock_allocator();
return RTEMS_INTERNAL_ERROR;
case OBJECTS_ERROR:
+ _RTEMS_Unlock_allocator();
return RTEMS_INVALID_ID;
case OBJECTS_LOCAL:
if ( _Heap_Get_information( &the_region->Memory, the_info ) ) {
- _Thread_Enable_dispatch();
+ _RTEMS_Unlock_allocator();
return RTEMS_SUCCESSFUL;
}
- _Thread_Enable_dispatch();
+ _RTEMS_Unlock_allocator();
return RTEMS_INVALID_ADDRESS;
}
diff --git a/c/src/exec/rtems/src/regiongetsegment.c b/c/src/exec/rtems/src/regiongetsegment.c
index 07a31c011e..613cec1303 100644
--- a/c/src/exec/rtems/src/regiongetsegment.c
+++ b/c/src/exec/rtems/src/regiongetsegment.c
@@ -20,6 +20,7 @@
#include <rtems/rtems/region.h>
#include <rtems/score/states.h>
#include <rtems/score/thread.h>
+#include <rtems/score/apimutex.h>
/*PAGE
*
@@ -58,18 +59,21 @@ rtems_status_code rtems_region_get_segment(
if ( size == 0 )
return RTEMS_INVALID_SIZE;
+ _RTEMS_Lock_allocator();
executing = _Thread_Executing;
the_region = _Region_Get( id, &location );
switch ( location ) {
case OBJECTS_REMOTE: /* this error cannot be returned */
+ _RTEMS_Unlock_allocator();
return RTEMS_INTERNAL_ERROR;
case OBJECTS_ERROR:
+ _RTEMS_Unlock_allocator();
return RTEMS_INVALID_ID;
case OBJECTS_LOCAL:
if ( size > the_region->maximum_segment_size ) {
- _Thread_Enable_dispatch();
+ _RTEMS_Unlock_allocator();
return RTEMS_INVALID_SIZE;
}
@@ -81,13 +85,13 @@ rtems_status_code rtems_region_get_segment(
if ( the_segment ) {
the_region->number_of_used_blocks += 1;
- _Thread_Enable_dispatch();
+ _RTEMS_Unlock_allocator();
*segment = the_segment;
return RTEMS_SUCCESSFUL;
}
if ( _Options_Is_no_wait( option_set ) ) {
- _Thread_Enable_dispatch();
+ _RTEMS_Unlock_allocator();
return RTEMS_UNSATISFIED;
}
@@ -100,7 +104,7 @@ rtems_status_code rtems_region_get_segment(
_Thread_queue_Enqueue( &the_region->Wait_queue, timeout );
- _Thread_Enable_dispatch();
+ _RTEMS_Unlock_allocator();
return (rtems_status_code) executing->Wait.return_code;
}
diff --git a/c/src/exec/rtems/src/regiongetsegmentsize.c b/c/src/exec/rtems/src/regiongetsegmentsize.c
index 63d8c96b1c..abdf755173 100644
--- a/c/src/exec/rtems/src/regiongetsegmentsize.c
+++ b/c/src/exec/rtems/src/regiongetsegmentsize.c
@@ -20,6 +20,7 @@
#include <rtems/rtems/region.h>
#include <rtems/score/states.h>
#include <rtems/score/thread.h>
+#include <rtems/score/apimutex.h>
/*PAGE
*
@@ -48,22 +49,25 @@ rtems_status_code rtems_region_get_segment_size(
Objects_Locations location;
Thread_Control *executing;
+ _RTEMS_Lock_allocator();
executing = _Thread_Executing;
the_region = _Region_Get( id, &location );
switch ( location ) {
case OBJECTS_REMOTE: /* this error cannot be returned */
+ _RTEMS_Unlock_allocator();
return RTEMS_INTERNAL_ERROR;
case OBJECTS_ERROR:
+ _RTEMS_Unlock_allocator();
return RTEMS_INVALID_ID;
case OBJECTS_LOCAL:
if ( _Heap_Size_of_user_area( &the_region->Memory, segment, size ) ) {
- _Thread_Enable_dispatch();
+ _RTEMS_Unlock_allocator();
return RTEMS_SUCCESSFUL;
}
- _Thread_Enable_dispatch();
+ _RTEMS_Unlock_allocator();
return RTEMS_INVALID_ADDRESS;
}
diff --git a/c/src/exec/rtems/src/regionident.c b/c/src/exec/rtems/src/regionident.c
index 57ca7638ed..5a43f25a19 100644
--- a/c/src/exec/rtems/src/regionident.c
+++ b/c/src/exec/rtems/src/regionident.c
@@ -20,6 +20,7 @@
#include <rtems/rtems/region.h>
#include <rtems/score/states.h>
#include <rtems/score/thread.h>
+#include <rtems/score/apimutex.h>
/*PAGE
*
diff --git a/c/src/exec/rtems/src/regionreturnsegment.c b/c/src/exec/rtems/src/regionreturnsegment.c
index e5174e578b..f144145afd 100644
--- a/c/src/exec/rtems/src/regionreturnsegment.c
+++ b/c/src/exec/rtems/src/regionreturnsegment.c
@@ -28,6 +28,7 @@
#include <rtems/rtems/region.h>
#include <rtems/score/states.h>
#include <rtems/score/thread.h>
+#include <rtems/score/apimutex.h>
/*PAGE
*
@@ -58,13 +59,16 @@ rtems_status_code rtems_region_return_segment(
#endif
int status;
+ _RTEMS_Lock_allocator();
the_region = _Region_Get( id, &location );
switch ( location ) {
case OBJECTS_REMOTE: /* this error cannot be returned */
+ _RTEMS_Unlock_allocator();
return RTEMS_INTERNAL_ERROR;
case OBJECTS_ERROR:
+ _RTEMS_Unlock_allocator();
return RTEMS_INVALID_ID;
case OBJECTS_LOCAL:
@@ -75,7 +79,7 @@ rtems_status_code rtems_region_return_segment(
if ( _Heap_Size_of_user_area( &the_region->Memory, segment, size ) ) {
memset(segment, (RTEMS_REGION_FREE_SHRED_PATTERN & 0xFF), size);
} else {
- _Thread_Enable_dispatch();
+ _RTEMS_Unlock_allocator();
return RTEMS_INVALID_ADDRESS;
}
#endif
@@ -85,7 +89,7 @@ rtems_status_code rtems_region_return_segment(
_Region_Debug_Walk( the_region, 4 );
if ( !status ) {
- _Thread_Enable_dispatch();
+ _RTEMS_Unlock_allocator();
return RTEMS_INVALID_ADDRESS;
}
@@ -110,7 +114,7 @@ rtems_status_code rtems_region_return_segment(
the_thread->Wait.return_code = RTEMS_SUCCESSFUL;
}
- _Thread_Enable_dispatch();
+ _RTEMS_Unlock_allocator();
return RTEMS_SUCCESSFUL;
}
diff --git a/c/src/exec/rtems/src/rtemstimer.c b/c/src/exec/rtems/src/rtemstimer.c
index 6954f1dec6..442f1656f7 100644
--- a/c/src/exec/rtems/src/rtemstimer.c
+++ b/c/src/exec/rtems/src/rtemstimer.c
@@ -38,14 +38,18 @@ void _Timer_Manager_initialization(
)
{
_Objects_Initialize_information(
- &_Timer_Information,
- OBJECTS_RTEMS_TIMERS,
- FALSE,
- maximum_timers,
- sizeof( Timer_Control ),
- FALSE,
- RTEMS_MAXIMUM_NAME_LENGTH,
- FALSE
+ &_Timer_Information, /* object information table */
+ OBJECTS_CLASSIC_API, /* object API */
+ OBJECTS_RTEMS_TIMERS, /* object class */
+ maximum_timers, /* maximum objects of this class */
+ sizeof( Timer_Control ), /* size of this object's control block */
+ FALSE, /* TRUE if the name is a string */
+ RTEMS_MAXIMUM_NAME_LENGTH /* maximum length of an object name */
+#if defined(RTEMS_MULTIPROCESSING)
+ ,
+ FALSE, /* TRUE if this is a global object class */
+ NULL /* Proxy extraction support callout */
+#endif
);
/*
diff --git a/c/src/exec/rtems/src/sem.c b/c/src/exec/rtems/src/sem.c
index 6f2db08ded..8c8df032a9 100644
--- a/c/src/exec/rtems/src/sem.c
+++ b/c/src/exec/rtems/src/sem.c
@@ -62,14 +62,18 @@ void _Semaphore_Manager_initialization(
)
{
_Objects_Initialize_information(
- &_Semaphore_Information,
- OBJECTS_RTEMS_SEMAPHORES,
- TRUE,
- maximum_semaphores,
- sizeof( Semaphore_Control ),
- FALSE,
- RTEMS_MAXIMUM_NAME_LENGTH,
- FALSE
+ &_Semaphore_Information, /* object information table */
+ OBJECTS_CLASSIC_API, /* object API */
+ OBJECTS_RTEMS_SEMAPHORES, /* object class */
+ maximum_semaphores, /* maximum objects of this class */
+ sizeof( Semaphore_Control ), /* size of this object's control block */
+ FALSE, /* TRUE if the name is a string */
+ RTEMS_MAXIMUM_NAME_LENGTH /* maximum length of an object name */
+#if defined(RTEMS_MULTIPROCESSING)
+ ,
+ FALSE, /* TRUE if this is a global object class */
+ NULL /* Proxy extraction support callout */
+#endif
);
/*
diff --git a/c/src/exec/rtems/src/semcreate.c b/c/src/exec/rtems/src/semcreate.c
index a0c015cde4..5d0fffb575 100644
--- a/c/src/exec/rtems/src/semcreate.c
+++ b/c/src/exec/rtems/src/semcreate.c
@@ -172,14 +172,8 @@ rtems_status_code rtems_semaphore_create(
_CORE_mutex_Initialize(
&the_semaphore->Core_control.mutex,
- OBJECTS_RTEMS_SEMAPHORES,
&the_mutex_attributes,
- lock,
-#if defined(RTEMS_MULTIPROCESSING)
- _Semaphore_MP_Send_extract_proxy
-#else
- NULL
-#endif
+ lock
);
} else {
if ( _Attributes_Is_priority( attribute_set ) )
@@ -202,18 +196,12 @@ rtems_status_code rtems_semaphore_create(
_CORE_semaphore_Initialize(
&the_semaphore->Core_control.semaphore,
- OBJECTS_RTEMS_SEMAPHORES,
&the_semaphore_attributes,
- count,
-#if defined(RTEMS_MULTIPROCESSING)
- _Semaphore_MP_Send_extract_proxy
-#else
- NULL
-#endif
+ count
);
}
- _Objects_Open( &_Semaphore_Information, &the_semaphore->Object, &name );
+ _Objects_Open( &_Semaphore_Information, &the_semaphore->Object, name );
*id = the_semaphore->Object.id;
diff --git a/c/src/exec/rtems/src/taskcreate.c b/c/src/exec/rtems/src/taskcreate.c
index 6183079c66..c445589687 100644
--- a/c/src/exec/rtems/src/taskcreate.c
+++ b/c/src/exec/rtems/src/taskcreate.c
@@ -182,7 +182,7 @@ rtems_status_code rtems_task_create(
THREAD_CPU_BUDGET_ALGORITHM_NONE,
NULL, /* no budget algorithm callout */
_Modes_Get_interrupt_level(initial_modes),
- &name
+ name
);
if ( !status ) {
diff --git a/c/src/exec/rtems/src/taskident.c b/c/src/exec/rtems/src/taskident.c
index 7d6baff020..f58b462814 100644
--- a/c/src/exec/rtems/src/taskident.c
+++ b/c/src/exec/rtems/src/taskident.c
@@ -59,7 +59,7 @@ rtems_status_code rtems_task_ident(
return RTEMS_SUCCESSFUL;
}
- status = _Objects_Name_to_id( &_RTEMS_tasks_Information, &name, node, id );
+ status = _Objects_Name_to_id( &_RTEMS_tasks_Information, name, node, id );
return _Status_Object_name_errors_to_status[ status ];
}
diff --git a/c/src/exec/rtems/src/tasks.c b/c/src/exec/rtems/src/tasks.c
index f9c7dfb5cf..d8fc8a0564 100644
--- a/c/src/exec/rtems/src/tasks.c
+++ b/c/src/exec/rtems/src/tasks.c
@@ -249,14 +249,18 @@ void _RTEMS_tasks_Manager_initialization(
#endif
_Objects_Initialize_information(
- &_RTEMS_tasks_Information,
- OBJECTS_RTEMS_TASKS,
- TRUE,
- maximum_tasks,
- sizeof( Thread_Control ),
- FALSE,
- RTEMS_MAXIMUM_NAME_LENGTH,
- TRUE
+ &_RTEMS_tasks_Information, /* object information table */
+ OBJECTS_CLASSIC_API, /* object API */
+ OBJECTS_RTEMS_TASKS, /* object class */
+ maximum_tasks, /* maximum objects of this class */
+ sizeof( Thread_Control ), /* size of this object's control block */
+ FALSE, /* TRUE if the name is a string */
+ RTEMS_MAXIMUM_NAME_LENGTH /* maximum length of an object name */
+#if defined(RTEMS_MULTIPROCESSING)
+ ,
+ FALSE, /* TRUE if this is a global object class */
+ NULL /* Proxy extraction support callout */
+#endif
);
/*
diff --git a/c/src/exec/rtems/src/timercreate.c b/c/src/exec/rtems/src/timercreate.c
index a1734e980f..a2e1fb72c5 100644
--- a/c/src/exec/rtems/src/timercreate.c
+++ b/c/src/exec/rtems/src/timercreate.c
@@ -58,7 +58,7 @@ rtems_status_code rtems_timer_create(
the_timer->the_class = TIMER_DORMANT;
- _Objects_Open( &_Timer_Information, &the_timer->Object, &name );
+ _Objects_Open( &_Timer_Information, &the_timer->Object, name );
*id = the_timer->Object.id;
_Thread_Enable_dispatch();