> typedef struct {
> Objects_Control Object;
> void (*destructor)( void * );
> void **Values[ OBJECTS_APIS_LAST + 1 ];
> } POSIX_Keys_Control;
>
The documentation on keys is a little thin but find it here:
http://rtems.org/onlinedocs/doc-current/share/rtems/html/posix_users/posix_users_368.html#Key-Manager
> 2. I doesn't quite understand the key create procedure.First, I'm not sure
> what determines the maximum variable at line4 in code below, is it equal to
> CONFIGURE_MAXIMUM_POSIX_KEYS in configuration? Second, where the code also
It's actually the maximum number of classic or posix tasks
(CONFIGURE_MAXIMUM_TASKS or POSIX_THREADS) depending on the API. this
code makes use of the fact that both classic and posix APIs store the
tasks at the [1] offset of their respective object table entry. It's
not entirely clear, but you can see this by looking at how the table
is loaded by calling _Objects_Initialize_information and that the
table stores along the first dimension the apis and along the second
dimension the classes (not in a matrix but in a compact vector). Look
at score/include/rtems/score/object.h for the definitions of the
meanings of the different APIs and their respective classes.
> allocates key memory for OBJECTS_INTERNAL_API, OBJECTS_CLASSIC_API, while in
> my opinion, only key memory allocation for OBJECTS_POSIX_API is enough. what
> are other things used for?
>
I'm unsure. It appears that this will let non-posix (classic) tasks
store thread-specific data using the posix key interface. Good
question.
Yes that is roughly the idea. Here is the standard on key create..
http://pubs.opengroup.org/onlinepubs/009604499/functions/pthread_key_create.html
> 4.As mentioned in [1], std::map can be an example for this project. I
> wonder is std::vector also appropriate for this project? Or maybe, several
> differection algorithms sould be implemented, and leave the choice to user?
> And I haven't study hash/map algorithm in depth, maybe, I should ask related
> question after do more homework on this.
>
I don't think you can use functions from C++ stl for this code. We
should evaluate some potential solutions and give preference to
algorithms that put the time complexity cost during key creation and
has fast, deterministic lookup times. The problem with just using a
hash+map function is that if the hash function does not give a good
distribution of keys or if the map algorithm limits the number of keys
then it may be hard to put a tight bound on the lookup time in the
worst-case.
> 5. What's the function naming convention in RTEMS, like _POSIX_Key_Get is an
> inline function, while _POSIX_Keys_Free_memory is not.
>
functions that are short usually get inlined. The naming convention
for internal code is (_API)_Package_name_Method_name(...), where _API
is optional; for posix internals it is _POSIX. For score the _API
normally is omitted (occasionally you will find something named
_CORE). For the public APIs the posix routines stick to the posix
standards, and the classic routines are rtems_package_method(...); the
chain and red-black tree data structures public APIs are implemented
in cpukit/sapi.
-Gedare
>
> links:
> [1]http://www.rtems.com/wiki/index.php/UseHashOrMapInNotepadsAndKeys
> [2]http://www.cs.cf.ac.uk/Dave/C/node29.html#SECTION002945000000000000000
>
> Best Regards!
> zw_yao
>
> _______________________________________________
> rtems-devel mailing list
> rtems...@rtems.org
> http://www.rtems.org/mailman/listinfo/rtems-devel
>
_______________________________________________
rtems-users mailing list
rtems...@rtems.org
http://www.rtems.org/mailman/listinfo/rtems-users
Keys are simple from a user viewpoint so there isn't much to document. :)
The issue at hand is that the Values table is an array of tables per API.
For each API, an array of (void *) elements is allocated. When the unlimited
allocation is tripped, the allocated array is not resized. The Values
element
needs to be replaced with a hash.
If you consider unlimited keys, there is a lot of memory reserved.
If you consider unlimited tasks/threads, then there are a lot of keys
which need to be resized.
Hashing avoids that. But we need reasonable performance for
insertion, setting, getting, and deletion of a value.
>
>> 2. I doesn't quite understand the key create procedure.First, I'm not sure
>> what determines the maximum variable at line4 in code below, is it equal to
>> CONFIGURE_MAXIMUM_POSIX_KEYS in configuration? Second, where the code also
> It's actually the maximum number of classic or posix tasks
> (CONFIGURE_MAXIMUM_TASKS or POSIX_THREADS) depending on the API. this
> code makes use of the fact that both classic and posix APIs store the
> tasks at the [1] offset of their respective object table entry. It's
> not entirely clear, but you can see this by looking at how the table
> is loaded by calling _Objects_Initialize_information and that the
> table stores along the first dimension the apis and along the second
> dimension the classes (not in a matrix but in a compact vector). Look
> at score/include/rtems/score/object.h for the definitions of the
> meanings of the different APIs and their respective classes.
OBJECTS_APIS_LAST is the number of APIs supported in RTEMS.
<null>=0, Internal=1, Classic=2, POSIX=3, and itron was = 4
For each of those, you need enough pointer slots for the
CONFIGURE_MAXIMUM_TASKS or CONFIGURE_MAXIMUM_POSIX_THREADS,
etc.
>> allocates key memory for OBJECTS_INTERNAL_API, OBJECTS_CLASSIC_API, while in
>> my opinion, only key memory allocation for OBJECTS_POSIX_API is enough. what
>> are other things used for?
>>
> I'm unsure. It appears that this will let non-posix (classic) tasks
> store thread-specific data using the posix key interface. Good
> question.
Exactly. You need to have keys for all tasks/threads no matter which API
was used to create the task/thread. We want them all to be supported
by keys.
This is an example of a key feature in RTEMS. All tasks/threads
at the API level are instances of SuperCore threads and thus
have the same attributes. You can use Classic API services
with POSIX threads, and POSIX API services with Classic API threads.
IMHO they are generally not useful and our current solution
lets them consume 0 bytes so no need to address them at
all in this project.
We couldn't do that when this idea was written up.
>> 4.As mentioned in [1], std::map can be an example for this project. I
>> wonder is std::vector also appropriate for this project? Or maybe, several
>> differection algorithms sould be implemented, and leave the choice to user?
>> And I haven't study hash/map algorithm in depth, maybe, I should ask related
>> question after do more homework on this.
>>
> I don't think you can use functions from C++ stl for this code. We
> should evaluate some potential solutions and give preference to
> algorithms that put the time complexity cost during key creation and
> has fast, deterministic lookup times. The problem with just using a
> hash+map function is that if the hash function does not give a good
> distribution of keys or if the map algorithm limits the number of keys
> then it may be hard to put a tight bound on the lookup time in the
> worst-case.
No C++ is allowed. None at the SuperCore effort. Say that
to yourself over and over. C++ compilable though.
This is for a C implementation at the SuperCore level which
can be used by keys and promoted out via an RTEMS specific
API. It will need to be documented in the user's manual.
>
>> 5. What's the function naming convention in RTEMS, like _POSIX_Key_Get is an
>> inline function, while _POSIX_Keys_Free_memory is not.
>>
> functions that are short usually get inlined. The naming convention
> for internal code is (_API)_Package_name_Method_name(...), where _API
> is optional; for posix internals it is _POSIX. For score the _API
> normally is omitted (occasionally you will find something named
> _CORE). For the public APIs the posix routines stick to the posix
> standards, and the classic routines are rtems_package_method(...); the
> chain and red-black tree data structures public APIs are implemented
> in cpukit/sapi.
And in this case Key vs Keys indicates a mistake. Both are
part of POSIX Keys.
Inlining rules generally focus on performance, readability,
proper typing, and not making testing harder. Inlining a method
with many if expressions leads to test case explosion and
is bad.
--joel
>
> -Gedare
>> links:
>> [1]http://www.rtems.com/wiki/index.php/UseHashOrMapInNotepadsAndKeys
>> [2]http://www.cs.cf.ac.uk/Dave/C/node29.html#SECTION002945000000000000000
>>
>> Best Regards!
>> zw_yao
>>
>> _______________________________________________
>> rtems-devel mailing list
>> rtems...@rtems.org
>> http://www.rtems.org/mailman/listinfo/rtems-devel
>>
> _______________________________________________
> rtems-users mailing list
> rtems...@rtems.org
> http://www.rtems.org/mailman/listinfo/rtems-users
--
Joel Sherrill, Ph.D. Director of Research& Development
joel.s...@OARcorp.com On-Line Applications Research
Ask me about RTEMS: a free RTOS Huntsville AL 35805
Support Available (256) 722-9985
Hashing avoids that. But we need reasonable performance for
insertion, setting, getting, and deletion of a value.
2. I doesn't quite understand the key create procedure.First, I'm not sureIt's actually the maximum number of classic or posix tasks
what determines the maximum variable at line4 in code below, is it equal to
CONFIGURE_MAXIMUM_POSIX_KEYS in configuration? Second, where the code also
(CONFIGURE_MAXIMUM_TASKS or POSIX_THREADS) depending on the API. this
code makes use of the fact that both classic and posix APIs store the
tasks at the [1] offset of their respective object table entry. It's
not entirely clear, but you can see this by looking at how the table
is loaded by calling _Objects_Initialize_information and that the
table stores along the first dimension the apis and along the second
dimension the classes (not in a matrix but in a compact vector). Look
at score/include/rtems/score/object.h for the definitions of the
meanings of the different APIs and their respective classes
OBJECTS_APIS_LAST is the number of APIs supported in RTEMS.
We couldn't do that when this idea was written up.No C++ is allowed. None at the SuperCore effort. Say that
4.As mentioned in [1], std::map can be an example for this project. II don't think you can use functions from C++ stl for this code. We
wonder is std::vector also appropriate for this project? Or maybe, several
differection algorithms sould be implemented, and leave the choice to user?
And I haven't study hash/map algorithm in depth, maybe, I should ask related
question after do more homework on this.
should evaluate some potential solutions and give preference to
algorithms that put the time complexity cost during key creation and
has fast, deterministic lookup times. The problem with just using a
hash+map function is that if the hash function does not give a good
distribution of keys or if the map algorithm limits the number of keys
then it may be hard to put a tight bound on the lookup time in the
worst-case.
to yourself over and over. C++ compilable though.
This is for a C implementation at the SuperCore level which
can be used by keys and promoted out via an RTEMS specific
API. It will need to be documented in the user's manual.
5. What's the function naming convention in RTEMS, like _POSIX_Key_Get is anfunctions that are short usually get inlined. The naming convention
inline function, while _POSIX_Keys_Free_memory is not.
for internal code is (_API)_Package_name_Method_name(...), where _API
is optional; for posix internals it is _POSIX. For score the _API
normally is omitted (occasionally you will find something named
_CORE). For the public APIs the posix routines stick to the posix
standards, and the classic routines are rtems_package_method(...); the
chain and red-black tree data structures public APIs are implemented
in cpukit/sapi.
Or a hash... I know the problem and don't claim to know the perfect solution. :)
But if you use thread ids as keys, you have known properties on the values being hashed or indexed.
--joel
阿四 <ashi...@gmail.com> wrote:
>2012/3/31 Joel Sherrill <joel.s...@oarcorp.com<mailto:joel.s...@oarcorp.com>>
>On 03/31/2012 09:06 AM, Gedare Bloom wrote:
_______________________________________________
Maybe this is something the project could focus on. Looking at both and
seeing how they stack up against each other.
Chris
Using the rbtree you don't need a hash since you can use thread ids
directly (I think?); using a hash you still need some structure to map
into for insert/search of key data, such as a tree or an array of
linked lists. The time complexity of the different map algorithms is
what matters most here. The usual hash+array solution is theoretically
quite bad in the worst case; leveraging properties about the threads
themselves might make it better. One problem that I see with using an
rbtree (or array+chain) is that the Key.Values will need to embed an
rbtree_node (or chain_node) along with the user data (void*).
I agree that evaluating different solutions for creating and finding
the Key data should be part of this project, and also determining
whether its possible to frontload some costs to key creation.
> Chris
>
> _______________________________________________
> rtems-devel mailing list
> rtems...@rtems.org
> http://www.rtems.org/mailman/listinfo/rtems-devel
_______________________________________________