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 <ged...@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 <ashi08...@gmail.com> wrote: > > Thanks for all good explanation. > > > > > > On Tue, Jul 9, 2013 at 11:24 PM, Sebastian Huber > > <sebastian.hu...@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.hu...@embedded-brains.de > >>> <mailto:sebastian.hu...@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.hu...@embedded-brains.de > >> PGP : Public key available on request. > >> > >> Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG. > > > > > > Cheers, > > Zhongwei > > >
_______________________________________________ rtems-devel mailing list rtems-devel@rtems.org http://www.rtems.org/mailman/listinfo/rtems-devel