<div dir="ltr">Hi all, this patch includes a reimplement of POSIX Key manager and compared with first version of this patch, some improvement is added.<br><br>*In short*: <br>it enable unlimited model in POSIX key manger and have a decent runtime on POSIX key searching, adding and deleting operations. Memory overhead is lower than current implementation when the size of key and key value becomes big.<br>
<br>*Some details*:<br>Current POSIX Key manager uses an array to manage POSIX Key value, so it can't support POSIX Key unlimited mode. This implementation uses a red-black tree(rbtree) to manage Key value. Because rbtree is a dynamic data structure, it makes the key manager can support unlimited mode. And the runtime of add, delete and search operation is log(n) for rbtree is a kind of balance tree.<br>
<br>There is only one rbtree in system. This rbtree contains all key values. Each node is like:<br><br>typedef struct {<br>  Chain_Node ch_node;<br>  RBTree_Node rb_node;<br>  pthread_key_t key;<br>  Objects_Id thread_id;<br>
  void *value;<br> }  POSIX_Keys_Rbtree_node;<br><br>Here, both pthread_key_t key and thread_id are used as rbtree's key. RBTree_Node rb_node is necessary for being a rbtree node. Void *value points to POSIX Key's value. There is also a ch_node, which is include in every thread's key chain. It is used  to keep track of every POSIX thread's key value. When thread exits, all key value can be deleted by iterating that thread's key chain.<br>
<br>Because it is inefficient that allocating one node each time when new node is added under unlimited mode, we employ a freelist structure to be a pool of POSIX_Keys_Rbtree_node. The pool's size is initialized to the size specified by rtems_resource_unlimited() macro(refer test case psxkey07 for concrete example). When pool is empty, freelist structure will expand its pool automatically with a size same as initial size. <br>
<br><br>Thanks,<br>Zhongwei<br><br></div>