[PATCH] add freelist data structure to score
Ashi
ashi08104 at gmail.com
Mon Jul 15 01:55:21 UTC 2013
Hi, all, I've updated this patch:
- rename freelist to freechain
- remove free_count
- replace freelist_bump() with an user defined extension handle
- add 2 test cases:
- spfreechain01: basic freechain operation test
- spfreechain02: test whether freechain works correctly when calls user
defined extension handle, and the handle uses malloc for memory allocation.
And I don't whether we need test case for user defined extension handle
which uses workspace for memory allocation.
Thanks,
Zhongwei
On Fri, Jul 12, 2013 at 6:57 PM, Ashi <ashi08104 at gmail.com> wrote:
>
>
>
> On Thu, Jul 11, 2013 at 9:18 PM, Gedare Bloom <gedare at rtems.org> wrote:
>
>> I don't think we need SAPI. We could consider adding a "classic"
>> manager interface. Meanwhile, you can write the testsuite with
>> "#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__" and access the supercore
>> freelist interface directly...
>>
> OK, I'll use direct way for now.
>
>>
>> On Thu, Jul 11, 2013 at 12:25 AM, Ashi <ashi08104 at gmail.com> wrote:
>> >
>> > And I'm adding the test case, and find we haven't the SAPI for freelist
>> yet.
>> > I must add it before adding test case, right? By the way, is the SAPI
>> same
>> > as the user-level API layer as Gedare mentioned before? I haven't
>> realized
>> > it before.
>> >
>> >
>> > On Wed, Jul 10, 2013 at 8:31 PM, Gedare Bloom <gedare at rtems.org> wrote:
>> >>
>> >> You would call extend instead of calling bump, or as part of bumping.
>> >
>> > Thanks, I see.
>> >>
>> >>
>> >> On Wed, Jul 10, 2013 at 2:30 AM, Ashi <ashi08104 at gmail.com> wrote:
>> >> > Thanks for all good explanation.
>> >> >
>> >> >
>> >> > On Tue, Jul 9, 2013 at 11:24 PM, Sebastian Huber
>> >> > <sebastian.huber at embedded-brains.de> wrote:
>> >> >>
>> >> >> On 07/09/2013 05:29 AM, Ashi wrote:
>> >> >>>
>> >> >>> Hi, Sebastian, thanks for your review!
>> >> >>>
>> >> >>> 在 2013-7-7 下午9:49,"Sebastian Huber"
>> >> >>> <sebastian.huber at embedded-brains.de
>> >> >>> <mailto:sebastian.huber at embedded-brains.de>>写道:
>> >> >>>
>> >> >>> >
>> >> >>> > Hello Ashi,
>> >> >>> >
>> >> >>> >
>> >> >>> > On 06/07/13 09:17, Ashi wrote:
>> >> >>> >>
>> >> >>> >> Hi all,
>> >> >>> >>
>> >> >>> >> this patch adds a data structure called freelist to score,
>> there
>> >> >>> are
>> >> >>> no
>> >> >>> >> test cases yet and should be added later.
>> >> >>> >
>> >> >>> >
>> >> >>> > I would appreciate to have the test for this new stuff included
>> in
>> >> >>> the
>> >> >>> patch.
>> >> >>>
>> >> >>>
>> >> >>> sure, I will update the patch with test cases.
>> >> >>> >
>> >> >>> >
>> >> >>> >>
>> >> >>> >> Freelist is a structure, which contains a chain of nodes. It
>> >> >>> supports
>> >> >>> 2
>> >> >>> >> operation:
>> >> >>> >> - get node from freelist
>> >> >>> >> - put node to freelist.
>> >> >>> >> And when there is no enough node in freelist, it will
>> >> >>> automatically
>> >> >>> >> increase itself's size by allocate more nodes from heap or
>> >> >>> workspace(which
>> >> >>> >> is specified by user).
>> >> >>> >
>> >> >>> >
>> >> >>> > What can I do if I like to get the nodes from a magic space?
>> >> >>>
>> >> >>>
>> >> >>> sorry for the unclear, you can get nodes from freelist by 'get'
>> >> >>> operation. And
>> >> >>> if you mean get nodes from heap or workspace, it's done by
>> >> >>> _Freelist_Get_node(), which calls _Freelist_Bump() when there is no
>> >> >>> free
>> >> >>> node left.
>> >> >>
>> >> >>
>> >> >> Yes, the problem is that you limit your Freelist to the heap and
>> >> >> workspace. If you use a handler function (or virtual method if you
>> >> >> like)
>> >> >> then you can avoid this limitation.
>> >> >>
>> >> >> [...]
>> >> >>
>> >> >>> >> +/**
>> >> >>> >> + * @typedef freelist_callout
>> >> >>> >> + */
>> >> >>> >> +typedef void (*freelist_callout)(
>> >> >>> >> + Freelist_Control *fc,
>> >> >>> >> + void *nodes
>> >> >>> >> +);
>> >> >>> >> +
>> >> >>> >> +/**
>> >> >>> >> + * @typedef Freelist_Control_struct
>> >> >>> >> + *
>> >> >>> >> + * This is used to manage each element.
>> >> >>> >> + */
>> >> >>> >> +struct Freelist_Control_struct {
>> >> >>> >> + Chain_Control Freelist;
>> >> >>> >> + size_t free_count;
>> >> >>> >
>> >> >>> >
>> >> >>> > Why do we need the free_count?
>> >> >>>
>> >> >>> free_count is used to keep track how many nodes there is in
>> freelist.
>> >> >>> And
>> >> >>> if
>> >> >>> free_count is 0 when you try to get node from freelist by call
>> >> >>> _Freelist_Get_node(), _Freelist_Get_node() will call
>> _Freelist_Bump()
>> >> >>> to
>> >> >>> allocate more node from heap or workspace.
>> >> >>
>> >> >>
>> >> >> The list knows if it is empty. There is not need to store this
>> >> >> information in two ways.
>> >> >>
>> >> >>
>> >> >>> >
>> >> >>> >> + size_t bump_count;
>> >> >>> >> + size_t node_size;
>> >> >>> >
>> >> >>> >
>> >> >>> >> + freelist_callout callout;
>> >> >>> >> + bool use_workspace;
>> >> >>> >> +};
>> >> >>> >
>> >> >>> >
>> >> >>> > I would replace this with an extend handler.
>> >> >>> >
>> >> >>> > /**
>> >> >>> > * @brief Extends the freelist.
>> >> >>> > *
>> >> >>> > * @param[in] freelist The freelist control.
>> >> >>> > *
>> >> >>> > * @return The count of new nodes.
>> >> >>> > */
>> >> >>> > typedef size_t ( *Freelist_Extend )( Freelist_Control *freelist
>> );
>> >> >>> >
>> >> >>> > This is much more flexible since you only specify the interface
>> and
>> >> >>> don't
>> >> >>> limit this to heap/workspace.
>> >> >>> >
>> >> >>> > You can provide a _Freelist_Extend_with_nothing() which simply
>> >> >>> returns
>> >> >>> 0.
>> >> >>>
>> >> >>> Yeah, this Freelist_Extend is very flexible, but I feel the
>> >> >>> Freelist_Extend is
>> >> >>> a little complex. As it shows in _Freelist_Bump(), if users
>> provides
>> >> >>> their own
>> >> >>> extension function, they have to append there new nodes to
>> freelist's
>> >> >>> internal
>> >> >>> chain and call their callout function on new nodes. And since
>> >> >>> _Freelist_Initialize() also would call Freelist_Extend(), if we
>> >> >>> provided
>> >> >>> _Freelist_Extend_with_nothing(), the initialization may fail.
>> >> >>
>> >> >>
>> >> >> Since the Freelist_Extend gets the Freelist as a first argument it
>> can
>> >> >> set
>> >> >> the extend handler to _Freelist_Extend_with_nothing() after the
>> first
>> >> >> invocation.
>> >> >>
>> >> >> Example:
>> >> >>
>> >> >>
>> >> >> /**
>> >> >> * @brief Extends the freelist.
>> >> >> *
>> >> >> * @param[in] freelist The freelist control.
>> >> >> */
>> >> >> typedef void ( *Freelist_Extend )( Freelist_Control *freelist );
>> >> >>
>> >> >> typedef struct {
>> >> >> Objects_Control obj;
>> >> >> int x;
>> >> >> } my_obj;
>> >> >>
>> >> >> void my_extend( Freelist_Control *freelist )
>> >> >> {
>> >> >> size_t bump_count = freelist->bump_count;
>> >> >> size_t size = bump_count * sizeof(my_obj);
>> >> >> my_obj *objs = malloc(size);
>> >> >>
>> >> >> _Freelist_Set_extend_handler( freelist,
>> _Freelist_Extend_with_nothing
>> >> >> );
>> >> >> _Chain_Initialize(
>> >> >> _Freelist_Get_list( freelist ),
>> >> >> objs,
>> >> >> bump_count,
>> >> >> size
>> >> >> );
>> >> >>
>> >> >> }
>> >> >
>> >> > I'm a little confused by my_extend() function, is it only called
>> after
>> >> > calling _Freelist_Initialize() by user?
>> >> >>
>> >> >>
>> >> >> [...]
>> >> >>
>> >> >> --
>> >> >> Sebastian Huber, embedded brains GmbH
>> >> >>
>> >> >> Address : Dornierstr. 4, D-82178 Puchheim, Germany
>> >> >> Phone : +49 89 189 47 41-16
>> >> >> Fax : +49 89 189 47 41-09
>> >> >> E-Mail : sebastian.huber at embedded-brains.de
>> >> >> PGP : Public key available on request.
>> >> >>
>> >> >> Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des
>> EHUG.
>> >> >
>> >> >
>> >> > Cheers,
>> >> > Zhongwei
>> >> >
>> >
>> >
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20130715/826da6b6/attachment-0001.html>
More information about the devel
mailing list