summaryrefslogtreecommitdiffstats
path: root/cpukit
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2013-08-06 15:28:59 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-08-08 14:11:21 +0200
commitc9b784f3e75d74e251eb68a978e832b37279ff66 (patch)
treeb32525ba63aa53bb621828e71ca01c5583976068 /cpukit
parentbsp/xilinx_zynq_zc706: Add. (diff)
downloadrtems-c9b784f3e75d74e251eb68a978e832b37279ff66.tar.bz2
posix: Delete POSIX_Keys_Freechain type
Use the POSIX configuration value directly. Use right type early and avoid casts. Use proper unlimited objects API. Check workspace allocation. Make functions static.
Diffstat (limited to 'cpukit')
-rw-r--r--cpukit/posix/include/rtems/posix/keyimpl.h31
-rw-r--r--cpukit/posix/src/key.c88
-rw-r--r--cpukit/posix/src/keyfreememory.c5
-rw-r--r--cpukit/posix/src/keyrundestructors.c28
-rw-r--r--cpukit/posix/src/keysetspecific.c4
5 files changed, 76 insertions, 80 deletions
diff --git a/cpukit/posix/include/rtems/posix/keyimpl.h b/cpukit/posix/include/rtems/posix/keyimpl.h
index b6b34b21dd..f01eda4de3 100644
--- a/cpukit/posix/include/rtems/posix/keyimpl.h
+++ b/cpukit/posix/include/rtems/posix/keyimpl.h
@@ -35,14 +35,6 @@ extern "C" {
*/
/**
- * @brief POSIX_Keys_Freechain is used in Freechain structure
- */
-typedef struct {
- Freechain_Control super_fc;
- size_t bump_count;
-} POSIX_Keys_Freechain;
-
-/**
* @brief The information control block used to manage this class of objects.
*/
POSIX_EXTERN Objects_Information _POSIX_Keys_Information;
@@ -55,7 +47,7 @@ POSIX_EXTERN RBTree_Control _POSIX_Keys_Key_value_lookup_tree;
/**
* @brief This freechain is used as a memory pool for POSIX_Keys_Key_value_pair.
*/
-POSIX_EXTERN POSIX_Keys_Freechain _POSIX_Keys_Keypool;
+POSIX_EXTERN Freechain_Control _POSIX_Keys_Keypool;
/**
* @brief POSIX key manager initialization.
@@ -65,14 +57,6 @@ POSIX_EXTERN POSIX_Keys_Freechain _POSIX_Keys_Keypool;
void _POSIX_Key_Manager_initialization(void);
/**
- * @brief POSIX key Freechain extend handle
- *
- * This routine extend freechain node, which is called in freechain_get
- * automatically.
- */
-bool _POSIX_Keys_Freechain_extend(Freechain_Control *freechain);
-
-/**
* @brief POSIX keys Red-Black tree node comparison.
*
* This routine compares the rbtree node
@@ -168,6 +152,19 @@ RTEMS_INLINE_ROUTINE POSIX_Keys_Control *_POSIX_Keys_Get (
_Objects_Get( &_POSIX_Keys_Information, (Objects_Id) id, location );
}
+RTEMS_INLINE_ROUTINE POSIX_Keys_Key_value_pair *
+_POSIX_Keys_Key_value_pair_allocate( void )
+{
+ return (POSIX_Keys_Key_value_pair *) _Freechain_Get( &_POSIX_Keys_Keypool );
+}
+
+RTEMS_INLINE_ROUTINE void _POSIX_Keys_Key_value_pair_free(
+ POSIX_Keys_Key_value_pair *key_value_pair
+)
+{
+ _Freechain_Put( &_POSIX_Keys_Keypool, key_value_pair );
+}
+
/** @} */
#ifdef __cplusplus
diff --git a/cpukit/posix/src/key.c b/cpukit/posix/src/key.c
index 99654c2da4..2b32b50bcf 100644
--- a/cpukit/posix/src/key.c
+++ b/cpukit/posix/src/key.c
@@ -22,6 +22,7 @@
#include <rtems/posix/keyimpl.h>
#include <rtems/posix/config.h>
#include <rtems/score/chainimpl.h>
+#include <rtems/score/objectimpl.h>
#include <rtems/score/wkspace.h>
/**
@@ -69,57 +70,60 @@ int _POSIX_Keys_Key_value_lookup_tree_compare_function(
return 0;
}
-/**
- * @brief This routine does user side freechain initialization
- */
-static void _POSIX_Keys_Freechain_init(Freechain_Control *freechain)
+static uint32_t _POSIX_Keys_Get_keypool_bump_count( void )
{
- POSIX_Keys_Freechain *psx_freechain_p = (POSIX_Keys_Freechain *)freechain;
- psx_freechain_p->bump_count =
- Configuration_POSIX_API.maximum_key_value_pairs & 0x7FFFFFFF;
- size_t size = psx_freechain_p->bump_count * sizeof(POSIX_Keys_Key_value_pair);
- POSIX_Keys_Key_value_pair *nodes = _Workspace_Allocate(size);
+ uint32_t max = Configuration_POSIX_API.maximum_key_value_pairs;
- _Chain_Initialize(
- &freechain->Freechain,
- nodes,
- psx_freechain_p->bump_count,
- sizeof(POSIX_Keys_Key_value_pair)
- );
+ return _Objects_Is_unlimited( max ) ?
+ _Objects_Maximum_per_allocation( max ) : 0;
}
-/**
- * @brief This routine does keypool initialize, keypool contains all
- * POSIX_Keys_Key_value_pair
- */
-
-static void _POSIX_Keys_Keypool_init(void)
+static uint32_t _POSIX_Keys_Get_initial_keypool_size( void )
{
- _Freechain_Initialize((Freechain_Control *)&_POSIX_Keys_Keypool,
- &_POSIX_Keys_Freechain_extend);
+ uint32_t max = Configuration_POSIX_API.maximum_key_value_pairs;
- _POSIX_Keys_Freechain_init((Freechain_Control *)&_POSIX_Keys_Keypool);
+ return _Objects_Maximum_per_allocation( max );
}
-/**
- * @brief This routine is user defined freechain extension handle
- */
-bool _POSIX_Keys_Freechain_extend(Freechain_Control *freechain)
+static bool _POSIX_Keys_Keypool_extend( Freechain_Control *keypool )
{
- POSIX_Keys_Freechain *psx_freechain_p = (POSIX_Keys_Freechain *)freechain;
- size_t node_size = sizeof(POSIX_Keys_Key_value_pair);
- size_t size = psx_freechain_p->bump_count * node_size;
- int i;
- POSIX_Keys_Key_value_pair *nodes = _Workspace_Allocate(size);
-
- if (!nodes)
- return false;
-
- for ( i = 0; i < psx_freechain_p->bump_count; i++ ) {
- _Freechain_Put(freechain,
- nodes + i);
+ size_t bump_count = _POSIX_Keys_Get_keypool_bump_count();
+ bool ok = bump_count > 0;
+
+ if ( ok ) {
+ size_t size = bump_count * sizeof( POSIX_Keys_Key_value_pair );
+ POSIX_Keys_Key_value_pair *nodes = _Workspace_Allocate( size );
+
+ ok = nodes != NULL;
+
+ if ( ok ) {
+ _Chain_Initialize(
+ &keypool->Freechain,
+ nodes,
+ bump_count,
+ sizeof( *nodes )
+ );
+ }
}
- return true;
+
+ return ok;
+}
+
+static void _POSIX_Keys_Initialize_keypool( void )
+{
+ Freechain_Control *keypool = &_POSIX_Keys_Keypool;
+ size_t initial_count = _POSIX_Keys_Get_initial_keypool_size();
+ size_t size = initial_count * sizeof( POSIX_Keys_Key_value_pair );
+ POSIX_Keys_Key_value_pair *nodes = _Workspace_Allocate_or_fatal_error( size );
+
+ _Freechain_Initialize( keypool, _POSIX_Keys_Keypool_extend );
+
+ _Chain_Initialize(
+ &keypool->Freechain,
+ nodes,
+ initial_count,
+ sizeof( *nodes )
+ );
}
/**
@@ -150,5 +154,5 @@ void _POSIX_Key_Manager_initialization(void)
true
);
- _POSIX_Keys_Keypool_init();
+ _POSIX_Keys_Initialize_keypool();
}
diff --git a/cpukit/posix/src/keyfreememory.c b/cpukit/posix/src/keyfreememory.c
index d971d0a95e..8c249486bb 100644
--- a/cpukit/posix/src/keyfreememory.c
+++ b/cpukit/posix/src/keyfreememory.c
@@ -54,9 +54,8 @@ void _POSIX_Keys_Free_memory(
next = _RBTree_Next_unprotected( iter, RBT_RIGHT );
_RBTree_Extract_unprotected( &_POSIX_Keys_Key_value_lookup_tree, iter );
_Chain_Extract_unprotected( &p->Key_values_per_thread_node );
- /* append the node to _POSIX_Keys_Keypool */
- _Freechain_Put( &_POSIX_Keys_Keypool.super_fc,
- ( void * )p);
+ _POSIX_Keys_Key_value_pair_free( p );
+
iter = next;
p = _RBTree_Container_of( iter, POSIX_Keys_Key_value_pair, Key_value_lookup_node );
}
diff --git a/cpukit/posix/src/keyrundestructors.c b/cpukit/posix/src/keyrundestructors.c
index 078f8f6e64..5f0a69917c 100644
--- a/cpukit/posix/src/keyrundestructors.c
+++ b/cpukit/posix/src/keyrundestructors.c
@@ -38,7 +38,7 @@ void _POSIX_Keys_Run_destructors(
)
{
Chain_Control *chain;
- Chain_Node *iter, *next;
+ POSIX_Keys_Key_value_pair *iter, *next;
void *value;
void (*destructor) (void *);
POSIX_Keys_Control *the_key;
@@ -49,9 +49,11 @@ void _POSIX_Keys_Run_destructors(
chain = &(
(POSIX_API_Control *)thread->API_Extensions[ THREAD_API_POSIX ]
)->Key_Chain;
- iter = _Chain_First( chain );
- while ( !_Chain_Is_tail( chain, iter ) ) {
- next = _Chain_Next( iter );
+ iter = (POSIX_Keys_Key_value_pair *) _Chain_First( chain );
+ while ( !_Chain_Is_tail( chain, &iter->Key_values_per_thread_node ) ) {
+ next = (POSIX_Keys_Key_value_pair *)
+ _Chain_Next( &iter->Key_values_per_thread_node );
+
/**
* remove key from rbtree and chain.
* here Chain_Node *iter can be convert to POSIX_Keys_Key_value_pair *,
@@ -60,31 +62,25 @@ void _POSIX_Keys_Run_destructors(
*/
_RBTree_Extract_unprotected(
&_POSIX_Keys_Key_value_lookup_tree,
- &((POSIX_Keys_Key_value_pair *)iter)->Key_value_lookup_node
+ &iter->Key_value_lookup_node
);
- _Chain_Extract_unprotected( iter );
+ _Chain_Extract_unprotected( &iter->Key_values_per_thread_node );
/**
* run key value's destructor if destructor and value are both non-null.
*/
- the_key = _POSIX_Keys_Get(
- ((POSIX_Keys_Key_value_pair *)iter)->key,
- &location
- );
+ the_key = _POSIX_Keys_Get( iter->key, &location );
destructor = the_key->destructor;
- value = ((POSIX_Keys_Key_value_pair *)iter)->value;
+ value = iter->value;
if ( destructor != NULL && value != NULL )
(*destructor)( value );
_Objects_Put( &the_key->Object );
- /**
- * put back this node to keypool
- */
- _Freechain_Put( &_POSIX_Keys_Keypool.super_fc,
- (void *)iter );
+ _POSIX_Keys_Key_value_pair_free( iter );
iter = next;
}
+
_Thread_Enable_dispatch();
}
diff --git a/cpukit/posix/src/keysetspecific.c b/cpukit/posix/src/keysetspecific.c
index ee718a4a03..8f5ce72035 100644
--- a/cpukit/posix/src/keysetspecific.c
+++ b/cpukit/posix/src/keysetspecific.c
@@ -43,8 +43,8 @@ int pthread_setspecific(
switch ( location ) {
case OBJECTS_LOCAL:
- value_pair_ptr = ( POSIX_Keys_Key_value_pair * )
- _Freechain_Get( &_POSIX_Keys_Keypool.super_fc );
+ value_pair_ptr = _POSIX_Keys_Key_value_pair_allocate();
+
if ( !value_pair_ptr ) {
_Objects_Put( &the_key->Object );